【发布时间】:2017-02-21 10:20:15
【问题描述】:
问题
我找到了几十篇关于在 Python 中使用 import 的基础知识的文章和教程,但没有一篇文章和教程可以提供有关使用多个包设置您自己的 Python 项目的全面指南。
这是我项目的结构:
-
codename/__init__.py-
package1.py(有class1,是一个脚本) -
package2.py(有class2) -
package3.py(有function1,是一个脚本)
-
test/__init__.py-
test_package1.py(有package1的单元测试) -
test_package3.py(有package3的单元测试)
我如何设置我的导入来满足以下要求(并且所有这些都有意义?):
-
class1、class2和function1在命名空间codename中,即这样可以:import codename obj = codename.class1() codename.function1(obj) 可以使用
from codename import *或from codename import class1以相同的方式导入它们-
function1可以轻松访问class1(如何?) -
package1和package2是可执行脚本 -
test_package1.py和test_package3.py也是如此 - 测试也可以通过
python -m unittest discover执行 - 脚本也可以通过
python -m codename.package1执行
由于某些原因,我遇到了所有这些问题,当我尝试解决一个问题时,另一个问题会弹出。
我尝试了什么?
- 将
codename/__init__.py留空满足几乎所有要求,因为一切正常,但在其模块的命名空间中留下class1之类的名称 - 而我希望将它们导入包中。 -
添加
from codename.package1 import class1等再次满足大部分要求,但通过python -m codename.package1执行脚本时收到警告:RuntimeWarning: 'codename.package2' found in sys.modules \ after import of package 'codename', but prior to execution of \ 'codename.package2'; this may result in unpredictable behaviour
哪一种有意义...
通过python codename/package1.py 函数运行脚本,但我想我可能会喜欢这两种工作方式。
- 我遇到an answer to a similar question 说内部模块不应该也是脚本,但我不明白为什么我们得到
-m开关?无论如何,将mains 提取到外部scripts目录中是可行的,但这是设置所有这些的唯一规范方法吗?
【问题讨论】:
标签: python