我正准备部署具有以下布局的Python包:
>>>
Column1 Column2
0 Hello TEST
1 Est Ting
2 Gg ff
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
包含:
setup.py
setup(name = MyPackage,
...
packages = find_packages(),
include_package_data = True,
entry_points = {"console_scripts" : [
"do_something = MyPackage.__main__:main"
]})
包含:
__main__.py
import tasks.something as something
something.my_function()
模块包含:
something
import db.db1 as db1
import db.db2 as db2
def my_function():
db1.this_func(...)
db2.that_func(...)
包含:
db1
和import sqlalchemy
import lib.utils as utils
def this_func(...):
sqlalchemy.create_engine(...)
包含:
db2
通过从已安装的import sqlalchemy
import lib.utils as utils
def that_func(...):
sqlalchemy.create_engine(...)
目录执行来运行时,site-packages
可以毫无问题地完成。如果我在交互式会话中执行__main__.py
,则该模块也会导入问题。但是,当我运行import MyPackage.tasks.something as something
脚本console_scripts
时,我收到do_something
的{{1}}错误。
是什么导致我的控制台脚本无法找到子包?
谢谢!
答案 0 :(得分:4)
按照以下示例更改导入:
__ main __。py :
import tasks.something as something
# to:
import MyPackage.tasks.something as something
# or
from .tasks import something as something
答案 1 :(得分:2)
这里有两个问题。
__main__.py
中的console_scripts
入口点目标需要解析为不接受任何参数的 callable 。就您而言,这意味着模块MyPackage/__main__.py
应该定义一个可调用的main
。像这样更改__main__.py
:
from MyPackage.tasks import something
def main():
# command line arguments parsing and logging configuration goes here ..
something.my_function()
if __name__ == "__main__":
main()
类似地,您应该将db1
,db2
和something
中的import语句更改为正确的相对导入:
from ..db import db1
from ..db import db2
from ..lib import utils
或者,使用绝对导入:
from MyPackage.db import db1
from MyPackage.db import db2
from MyPackage.lib import utils