Python Imports不起作用

时间:2014-08-07 19:00:02

标签: python macos module

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

8 个答案:

答案 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 pathHow 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__.pythepackage文件夹中添加thesubpackage个空文件,而不仅仅是thesubpackage个文件夹。

然后这个简单的代码应该可以工作:

from thepackage.thesubpackage import mary
print mary.marie