Ale*_*lex 4 python setuptools python-3.x python-packaging
我准备部署一个具有以下布局的 Python 包:
MyPackage/
setup.py
MyPackage/
__init__.py
__main__.py
lib/
__init__.py
utils.py
db/
__init__.py
db1.py
db2.py
tasks/
__init__.py
something.py
Run Code Online (Sandbox Code Playgroud)
其中setup.py包含:
setup(name = MyPackage,
...
packages = find_packages(),
include_package_data = True,
entry_points = {"console_scripts" : [
"do_something = MyPackage.__main__:main"
]})
Run Code Online (Sandbox Code Playgroud)
__main__.py包含:
import tasks.something as something
something.my_function()
Run Code Online (Sandbox Code Playgroud)
something模块包含:
import db.db1 as db1
import db.db2 as db2
def my_function():
db1.this_func(...)
db2.that_func(...)
Run Code Online (Sandbox Code Playgroud)
db1包含:
import sqlalchemy
import lib.utils as utils
def this_func(...):
sqlalchemy.create_engine(...)
Run Code Online (Sandbox Code Playgroud)
并db2包含:
import sqlalchemy
import lib.utils as utils
def that_func(...):
sqlalchemy.create_engine(...)
Run Code Online (Sandbox Code Playgroud)
通过从安装的site-packages目录执行来运行时,__main__.py可以顺利完成。如果我import MyPackage.tasks.something as something在交互式会话中执行,该模块导入也会出现问题。但是,当我运行console_scripts脚本时,我收到了错误。do_somethingModuleNotFoundtasks
是什么导致我的控制台脚本无法找到子包?
提前致谢!
按照以下示例更改您的导入:
__main__.py:
import tasks.something as something
# to:
import MyPackage.tasks.something as something
# or
from .tasks import something as something
Run Code Online (Sandbox Code Playgroud)