如何在 python 中的打包库中执行动态导入?

How can I perform a dynamic import inside a packaged library in python?

我正在编写一个库,该库将被打包并可通过 Pypi 上的 pip 安装。我的 setup.py

中有几个脚本目标
"console_scripts": [
    "mlab=install.make_lab:mlab",
    "rlab=install.run_lab:rlab",
    "clab=install.clear_lab:clab"
]

这些主要用作补充主库的程序员工具。

mlab命令在用户项目中创建如下目录结构:

laboratory/
          |- lab.py
          |- labmain.py

在 labmain.py 我有一个 main() 函数。

import laboratory.lab as lab

def main():
    print("I am the main!")
    print(lab.name)

我想将此主要方法附加到我的 shell 命令中。

我试过这个:

import os

def rlab():
    """
    This shell command is used to run a lab.
    """
    lab_dir_path = os.path.join(os.getcwd(), "laboratory")
    if not os.path.isdir(lab_dir_path):
        print("No lab exists... run the mlab command to make a lab.")
    main = __import__("laboratory.labmain")
    os.chdir("laboratory")
    main.main()

以及使用 from laboratory import labmain

直接导入

我继续得到一个ModuleNotFoundError

需要注意的是rlab函数正在打包,然后通过twine上传到testpypi。然后我将包安装在一个单独的项目中,其中包含在我 运行 mlab shell 命令之后的实验室结构。一切似乎都很好,直到它被打包。

你快到了。您必须完成函数参数的填写。您可能需要将 0 更改为 1-1

labmain = __import__("laboratory.labmain", globals(), locals(), ['main'], 0)

labmain.main()

此外,请确保 laboratory 目录位于 sys.path

import sys

sys.path.append('z:/path/to/laboratory')