Python 导入无效

2 投票
8 回答
4572 浏览
提问于 2025-04-18 16:27

为了最终测试模块和子包,我在我的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 个回答

1

试试这个:

    import sys
    sys.path.append("thepackage/thesubpackage")
    from thepackage.thesubpackage import mary

    print mary.marie

你需要把这个包添加到路径中,这样才能从中导入内容。

1

如果“mary”或“marie”是一个模块,那么它必须放在桌面上或者Python的文件夹里。你可以把这个缺失的模块移动到桌面文件夹,然后再把“mary”或“marie”添加到类似于/usr/lib/python*的目录里。

1

如果布局和显示的一模一样,并且假设__init__.py是空的,那么在importest.py中,以下任何一种方式都可以使用:

import thepackage.thesubpackage.mary
from thepackage.thesubpackage import mary

在第一种情况下,你需要用thepackage.thesubpackage.mary.marie来引用这个字符串。而在第二种情况下,只需要用mary.marie就可以了。

3

在你的 importtest.py 文件里放这段代码应该没问题:

from thepackage.thesubpackage import mary 
print mary.marie
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。输出的第一列就是权限信息。

撰写回答