我是否错误地组织了 Python 目录?
Did I organise my Python directory incorrectly?
我正在尝试在 Python 中制作一个独立的应用程序,但有一些与导入和项目目录结构相关的问题我不知道如何解决。
项目结构如下:
root/
app/
__init__.py
main.py
foo.py
tests/
__init__.py
main_tests.py
foo_tests.py
这是我不知道如何解决的两个相互冲突的要求:
测试是使用 Nose 框架编写的。当我从 root
目录 运行 nosetests
时,它要求所有导入都相对于 app
包。
# app/main.py
import app.foo # `import foo` will not work
另一方面,如果我想 运行 来自 root
的应用程序(使用像 python app/main.py
), 另一个问题出现了。它会正确地抱怨找不到 app
包。
我该如何解决这些问题?我的项目组织方式有什么需要改变的吗?
你应该有一个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
本身或包中任何可能的 C 语言扩展模块后,您才需要重新 运行 setup.py develop
。
或者 运行 您的主模块
python -m app.main
特别是 不要 尝试 运行 来自 的应用程序在 带有 python app/main
的包中,因为它从来不应该那样工作。
为了开发代码,你有一个virtualenv,然后你可以使用python setup.py develop
将代码link放到virtualenv中;一个特殊的 link 安装到 site-packages
中,它指向您的应用程序的源代码,因此您可以就地开发它,但它的行为就像安装到 site-packages
中一样。
我正在尝试在 Python 中制作一个独立的应用程序,但有一些与导入和项目目录结构相关的问题我不知道如何解决。
项目结构如下:
root/
app/
__init__.py
main.py
foo.py
tests/
__init__.py
main_tests.py
foo_tests.py
这是我不知道如何解决的两个相互冲突的要求:
测试是使用 Nose 框架编写的。当我从
root
目录 运行nosetests
时,它要求所有导入都相对于app
包。# app/main.py import app.foo # `import foo` will not work
另一方面,如果我想 运行 来自
root
的应用程序(使用像python app/main.py
), 另一个问题出现了。它会正确地抱怨找不到app
包。
我该如何解决这些问题?我的项目组织方式有什么需要改变的吗?
你应该有一个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
本身或包中任何可能的 C 语言扩展模块后,您才需要重新 运行 setup.py develop
。
或者 运行 您的主模块
python -m app.main
特别是 不要 尝试 运行 来自 的应用程序在 带有 python app/main
的包中,因为它从来不应该那样工作。
为了开发代码,你有一个virtualenv,然后你可以使用python setup.py develop
将代码link放到virtualenv中;一个特殊的 link 安装到 site-packages
中,它指向您的应用程序的源代码,因此您可以就地开发它,但它的行为就像安装到 site-packages
中一样。