我正在运行一些科学模拟,我想用Python处理结果数据。模拟生成一个自定义数据类型,该数据类型不在模拟作者生成的程序链之外使用,因此很不幸,我需要他们提供的数据类型。在
他们要我安装两个文件:
sdds.py
的模块,它定义了一个提供所有用户函数和两个演示的类sddsdatamodule.so
的已编译模块,它只为sdds.py
提供帮助函数。在我觉得这两个模块不可能直接从我的角度来编写代码,而不是直接把它们连接起来。它们来自同一家公司,它们被设计成一起完成一项特定的任务:访问和操作SDDS类型的文件。在
所以我想把它们放进一个包裹里。我可以在我的路径上安装它,它将是自包含的,我可以很容易地从一个位置找到并卸载或升级模块。然后我就可以把他们的非python解决方案隐藏在一个更具python风格的包中,而不需要大量重写。看起来很优雅。在
我在这里找到了这个包裹:
不幸的是,他们现在只支持Windows和macosx。编译源代码是相当繁重的,显然他们对Linux/Unix没有重要的要求。我有一台Mac电脑,谢天谢地这对我来说不是问题。在
所以我的目录树是这样的:
SDDSPython/ My toplevel package
__init__.py Designed to only import the SDDS class
sdds.py Defines SDDS class and two demo methods
sddsdatamodule.so Defines sddsdata module used by SDDS class.
我的__init__.py
文件实际上只包含以下内容:
sdds.py
文件包含类定义和两个演示定义。sdds.py
文件中唯一的其他代码是:
import sddsdata, sys, time
class SDDS:
(lots of code here)
def demo(output):
(lots of code here)
def demo2(output):
(lots of code here)
然后我可以导入SDDSPython
并使用dir
进行检查:
>>> import SDDSPython
>>> dir(SDDSPython)
['SDDS', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'sdds', 'sddsdata']
所以我现在可以通过SDDSPython.SDDS
来访问SDDS
类
SDDSPython.sdds
和{SDDSPython
命名空间的??在
>>> SDDSPython.sdds
<module 'SDDSPython.sdds' from 'SDDSPython/sdds.pyc'>
>>> SDDSPython.sddsdata
<module 'SDDSPython.sddsdata' from 'SDDSPython/sddsdatamodule.so'>
我认为通过创建一个__init__.py
文件,我明确地排除了sdds
和{SDDSPython
命名空间中。怎么回事?我只能假设这是由于sddsdatamodule.so
文件中的某些东西造成的?但是一个模块怎么会像这样影响其父级的命名空间呢?我迷路了,不知道从哪里开始。我看过C代码,但没发现任何可疑之处。公平地说,我可能不知道可疑的东西会是什么样子,我可能对为Python编写C扩展不够熟悉。在
这是因为python导入的工作方式与您想象的不一样。它们是这样工作的:
types.ModuleType
实例,将其上的几个属性设置为相应的文件(__file__
,__name__
等等),然后将该对象插入到sys.modules
中,并使用它应该具有的完全限定的模块名。在from
导入的情况下,模块中的属性可以返回到导入脚本。在所以这意味着如果我导入一个模块(比如,
foo.py
),该模块只有:然后在foo中有一个全局名为
bar
,我可以以foo.bar
的形式访问它。在python中没有“只执行我现在要使用的python脚本的一部分”的功能。在
奇怪的问题我用一个类似的测试用例为你做了一些调查。在
似乎从模块导入一个类,即使只导入一部分,整个模块也可以按照您描述的方式访问,即:
^{pr2}$这是意料之中的,因为我没有
import Sink
在__init__.py
中……但是!在我添加了一行缩进.py公司名称:
现在,由于此类导入了
XML
包中包含的模块,如果我这样做:因此,由于导入的
sdds
模块也导入了sddsdata
,所以您可以访问它。这回答了你问题中“怎么做”的部分,但是“为什么”是这样的,我相信文档中肯定有答案:)我希望这会有帮助-我确实是在打字的时候这样做的!对我来说也是一次学习经历。在
相关问题 更多 >
编程相关推荐