我有一个具有以下结构的python项目:
/project
/bin
executable
/app
__init__.py
a.py
b.py
c.py
在/project
目录中,我尝试运行可执行文件,这取决于app
包中的模块:
./bin/executable
然而,当我尝试这个时,python无法找到应用包中定义的任何模块,导致ImportError: No module named XYZ
错误。
根据我的理解,__init__.py
目录中app
的存在应该将其标记为模块?
我做错了什么?
答案 0 :(得分:1)
如果您将以下内容添加到可执行文件中(在尝试导入应用程序模块之前):
import sys; print sys.path
...
import app
您将看到当前工作目录未包含在路径中。我建议你通过添加setup.py
文件来创建一个合适的Python包。然后,您可以安装您的软件包,您的可执行文件应该可以正常工作。
这是一个简单的setup.py
文件:
from setuptools import find_packages, setup
config = {
'name': 'app',
'version': '0.1.0',
'description': 'some app',
'packages': find_packages(),
}
setup(**config)
我更喜欢安装到virtualenv:
virtualenv venv
source venv/bin/activate
python setup.py install
./bin/executable
现在,如果您停用该virtualenv并尝试再次运行您的可执行文件,您将获得原始ImportError
。
花几分钟时间阅读Python Packaging User Guide。
此外,您可能希望使用python setup.py develop
代替python setup.py install
。