簡體   English   中英

Python package 分發與 entry_point 控制台腳本

[英]Python package distribution with entry_point console_script

我正准備部署一個 Python package 布局如下:

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完成沒有問題。 如果我在交互式 session 中執行import MyPackage.tasks.something as something ,則該模塊也會導入問題。 但是,當我運行console_scripts腳本do_something時,我收到了針對tasksModuleNotFound錯誤。

是什么導致我的控制台腳本無法找到子包?

提前致謝!

按照以下示例更改您的導入:

__main__.py

import tasks.something as something

# to:

import MyPackage.tasks.something as something

# or

from .tasks import something as something

這里有兩個問題。

  1. __main__.py中的導入語句是隱式相對的。 將它們更改為絕對導入。
  2. console_scripts入口點目標需要解析為不接受 arguments的可調用對象。 在您的情況下,這意味着模塊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()

同樣,您somethingdb1db2中的導入語句更改為正確的相對導入:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM