我正在尝试在Python中创建一个独立的应用程序,并且存在一些与导入和项目目录结构相关的问题,我不知道如何解决。
这就是项目的结构:
root/
app/
__init__.py
main.py
foo.py
tests/
__init__.py
main_tests.py
foo_tests.py
这些是我不知道如何解决的两个相互矛盾的要求:
使用Nose框架编写测试。当我从nosetests
目录运行root
时,它要求所有导入都相对于app
包。
# app/main.py
import app.foo # `import foo` will not work
另一方面,如果我想从root
(使用python app/main.py
之类的命令)运行应用程序,则会出现另一个问题。它会正确地抱怨它无法找到app
包。
我该如何解决这些问题?在组织我的项目时,有什么需要改变的吗?
答案 0 :(得分:1)
你应该有setup.py
;在setup.py
你应该有:
setup(
...
scripts = ['bin/run_my_app']
...
)
和bin/run_my_app
然后是包含内容的脚本:
#!/usr/bin/env python
from app.main import main
main()
现在,当您运行python setup.py develop
或python setup.py install
时,setuptools
/ distribute
会将命令行脚本run_my_app
安装到您的路径中。 python setup.py develop
使每次更改源代码后无需重新安装包到virtualenv;只有在更改setup.py develop
本身或程序包中任何可能的C语言扩展模块后,才需要重新运行setup.py
。
或者使用
运行主模块python -m app.main
尤其是不尝试使用python app/main
从 包中运行应用程序,因为它从来没有像这样工作。
为了开发代码,你有一个virtualenv,然后你可以使用python setup.py develop
将代码链接到virtualenv;在site-packages
中安装了一个指向应用程序源代码的特殊链接,因此您可以在适当的位置开发它,但它的行为就像它已安装到site-packages
中一样。