在Mac和Windows上运行python 3.7.3,同时解决了我的其他问题:
Cannot find submodule in a package on one PC but not on another PC
我已经阅读了许多有关软件包和模块的帖子,例如:
Can someone explain __all__ in Python?
但是,我仍然得到意想不到的结果。
我有一个包裹结构
pypkg/
__init__.py
src/
__init__.py
app.py
util/
__init__.py
util.py
src / app.py的工作原理如下
# app.py
from pprint import pprint
import sys
pprint(sys.path, indent=4)
from util import *
def main():
print('this is app.')
util.func()
pprint(sys.path, indent=4)
if __name__ == '__main__':
main()
util / util.py看起来像这样
# util.py
def func():
print('this is func from util.')
我希望坐在项目根目录下,即/path/to/pypkg/
,我应该可以打电话:
python src/app.py
使其运行没有问题。
但是,它给了我
ModuleNotFoundError: No module named 'util'
然后我切换到运行状态
python -m src.app
这次我得到:
NameError: global name 'util' is not defined
最后,我将以下内容手动添加到util/__init__.py
:
__all__ = ['util']
这次运行正常。
根据经验我的假设:
-m
选项的Python时,软件包依赖项才有效。__init__.py
可以为空的印象是一种误解。如果我要使用from <package> import *
,则__init__.py
必须定义__all__
。我的问题:我的假设都正确吗?
如果我所有的假设都是正确的,那么使用带有代码库的程序包系统将很烦人,该代码库混合了应用程序代码和依赖项代码,通常您希望在任何地方进入命令行,只需调用{{ 1}}。但是软件包似乎不适用于这种范例。
现在我的下一个问题:
我应该以这种方式使用包裹吗?如果“包”本身包含应用程序代码,这是坚持使用旧的python random/relative/path/to/script.py
黑客工具的最佳做法吗?