2017-07-07 43 views
1

我有以下结构:python中的这个包结构有什么问题?

/MyApp 
    /Module_A 
    __init__.py 
    serviceFile.py 
    /Module_B 
    clientFile.py 

我试图从ClientFile.py

From MyApp.Module_a import ServiceFile 

调用一个函数在ServiceFile.py但我得到的错误

ImportError: No module named MyApp.Module_a

为什么? 顺便说一句,当我从pyCharm运行它只能在CDM中工作。 两者都使用python 2.7

+0

这个在Pycharm中工作的原因是因为它在幕后制作了一些可以确保Python能够找到'Module_a'的魔法。如果你想从终端运行,你可能会不得不捣乱'sys.insert()'。 –

+2

你的文件列表,问题文本,python代码和与大小写相关的python错误有很多不一致之处。 Python区分大小写。确保所有这些'Module_A'和'Module_a','serviceFile'和'ServiceFile'对在任何地方都是一样的。 –

+0

'MyApp'和'Module_B'是否缺少'__init __。py'? –

回答

1

您应该在MyApp目录和Module_B目录中都输入__init__.py文件。这使电话from MyApp.Module_B import clientFile为我工作。这里是我的树:

└── MyApp 
    ├── __init__.py 
    ├── Module_B 
    │   ├── clientFile.py 
    │   ├── __init__.py 

默认情况下,Python将不知道某个.py文件是模块的一部分,如果它不是“链接”到__init__.py文件。

2

可能有2个错误来源。第一个,就像@TomCho已经指出的那样,如果__init__.py文件在您的模块中不正确。然而,由于它在PyCharm中工作,我猜这是第二个。

第二个是如果您的PYTHONPATH变量设置不正确。有很多地方python默认会查找模块。这包括Python安装目录和当前工作目录等地方。要查看的地方的完整列表的Python看起来,做..然后

import sys 
print(sys.path) 

Python会降临到每个具有__init__.py文件目录,这是什么使这个文件很重要。然而,很可能你没有把你的代码放到Python看起来的默认位置。这就是PYTHONPATH环境变量的全部目的。你可以将它作为你的软件包的路径列表,然后这些将会被添加到上面看到的sys.path

默认情况下,PyCharm会将您的项目目录添加到PYTHONPATH,这就是为什么我猜测它在PyCharm中工作,而不是在命令行上。

设置PYTHONPATH在Linux中,进入命令行,键入

export PYTHONPATH=/path/to/python/module 

如果你有一个以上的路径,你需要添加,可以随时追加与:所以更普遍的情况是

export PYTHONPATH=$PYTHONPATH:/path/to/python/module 

你可以继续这样做。我通常将该行添加到我的~/.bashrc文件中。

如果你在windows中,modifying environment variables是不同的,但它仍然很容易。