Python 导入无效
为了最终测试模块和子包,我在我的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讨论里提到的那些方法。
我还尝试在thesubpackage文件夹里的__init__.py
文件中添加__all__ = ["mary"]
。
但是我尝试的所有方法都没有成功。有没有什么想法?
编辑:
在尝试建议的解决方案时,我遇到了这些错误:
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
8 个回答
试试这个:
import sys
sys.path.append("thepackage/thesubpackage")
from thepackage.thesubpackage import mary
print mary.marie
你需要把这个包添加到路径中,这样才能从中导入内容。
如果“mary”或“marie”是一个模块,那么它必须放在桌面上或者Python的文件夹里。你可以把这个缺失的模块移动到桌面文件夹,然后再把“mary”或“marie”添加到类似于/usr/lib/python*的目录里。
如果布局和显示的一模一样,并且假设__init__.py
是空的,那么在importest.py
中,以下任何一种方式都可以使用:
import thepackage.thesubpackage.mary
from thepackage.thesubpackage import mary
在第一种情况下,你需要用thepackage.thesubpackage.mary.marie
来引用这个字符串。而在第二种情况下,只需要用mary.marie
就可以了。
在你的 importtest.py
文件里放这段代码应该没问题:
from thepackage.thesubpackage import mary
print mary.marie
你提到的 '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
。输出的第一列就是权限信息。