我是否错误地组织了我的Python目录?

时间:2015-02-19 18:35:42

标签: python directory-structure nose

我正在尝试在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包。

我该如何解决这些问题?在组织我的项目时,有什么需要改变的吗?

1 个答案:

答案 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 developpython 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中一样。