为了最终测试模块和子包,我在Mac OSX Mavericks上创建了一个新文件夹。 该文件夹的位置是桌面:
packtest
|-- importtest.py
|-- thepackage
|-- __init__.py
|-- thesubpackage
|-- __init__.py
|-- mary.py
mary.py包含一个变量:
marie="Hello"
,别无其他。
在importtest.py中我要打印出来。 我尝试了不同的导入方式,基本上是这个Python: importing a sub‑package or sub‑module线程中所述的方法。
此外,我尝试将__all__ = ["mary"]
添加到thesubpackage文件夹中的__init__.py
。
但我尝试的都没有奏效。任何想法?
编辑:
在尝试建议的解决方案时,我遇到了这些错误:
import thepackage.thesubpackage.mary
print thepackage.thesubpackage.mary.marie
结果:
$ python importtest.py
Traceback (most recent call last):
File "importtest.py", line 1, in <module>
import thepackage.thesubpackage.mary
ImportError: No module named thepackage.thesubpackage.mary
尝试时:
from thepackage.thesubpackage import mary
print mary.marie
错误是:
$ python importtest.py
Traceback (most recent call last):
File "importtest.py", line 1, in <module>
from thepackage.thesubpackage import mary
ImportError: No module named thepackage.thesubpackage
答案 0 :(得分:3)
在importtest.py
中使用此代码应该有效:
from thepackage.thesubpackage import mary
print mary.marie
答案 1 :(得分:3)
'thepackage','thesubpackage'等等实际上您正在使用的软件包的名称,或者您在此处替换它们作为示例?如果名称不同,那么您可能会遇到名称冲突。尝试这个,但是使用包的实际名称,如果它不同:
在'packtest'目录中,启动python解释器,然后输入:
>>> import thepackage
有效吗?如果是这样,请尝试:
>>> thepackage.__path__
您应该看到['thepackage']
。如果你看到不同的东西,那就是你的问题:你正在导入一个名为thepackage
的不同包,它可能没有thesubpackage.mary
模块,这是ImportError的来源。我不确定为什么会这样; Python应首先在本地目录中搜索,然后查看你的PATH和你的PYTHONPATH。
编辑:这是另一种可能性:'thepackage'目录及其嵌套子目录的权限是什么?我做了一个实验:
$ mkdir something
$ touch something/__init__.py
$ chmod 000 something
$ python
>>> import something
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named something
>>>
$ chmod 744 something
$ python
>>> import something
>>>
要查看权限,请从“packtest”目录中的终端输入ls -l
。输出的第一列是权限。
答案 2 :(得分:1)
如果布局完全如图所示,并且假设为空__init__.py
,则以下任何内容都应在importest.py
中有效:
import thepackage.thesubpackage.mary
from thepackage.thesubpackage import mary
在第一种情况下,您需要将字符串引用为thepackage.thesubpackage.mary.marie
。在第二个,mary.marie
。
答案 3 :(得分:1)
如果mary或marie是一个模块,那么它必须位于桌面或Python的目录中。将缺少的模块移动到Desktop文件夹,然后将mary或marie添加到/ usr / lib / python *目录。
答案 4 :(得分:1)
你试过imp模块吗?我想最好从标题目录遍历,即绝对路径。
../
导入imp foo = imp.load_source(&#39; file&#39;,&#39; File \ Directory \ file.py&#39;)
然后foo将是模块的名称,例如foo.method()
../
请看看这些:Import a module from a relative path和How to do relative imports in Python?,我相信你肯定会在这里为你的案例找到一些东西。
答案 5 :(得分:1)
即便是其他人确认我已经测试了您的设置,通过创建您的结构和内容,最后在importtest.py中编写了以下内容
import thepackage.thesubpackage.mary as mary
print(mary.marie)
import thepackage.thesubpackage.mary
print(thepackage.thesubpackage.mary.marie)
两者都没有在PYTHONPATH或类似设置中设置任何东西,从一个简单的shell运行。正如我在Windows7(32位)上做得那么成功,但它对你的Mac不起作用,难道它不应该是特定于Mac的东西吗?
答案 6 :(得分:1)
试试这个:
import sys
sys.path.append("thepackage/thesubpackage")
from thepackage.thesubpackage import mary
print mary.marie
您应该将包添加到路径中以便从中导入。
答案 7 :(得分:1)
您必须在__init__.py
和thepackage
文件夹中添加thesubpackage
个空文件,而不仅仅是thesubpackage
个文件夹。
然后这个简单的代码应该可以工作:
from thepackage.thesubpackage import mary
print mary.marie