【问题标题】:How can I perform a dynamic import inside a packaged library in python?如何在 python 的打包库中执行动态导入?
【发布时间】:2021-07-26 09:35:57
【问题描述】:

我正在编写一个库,该库将被打包并可以通过 Pypi 上的 pip 安装。我的 setup.py 中有一些脚本目标

"console_scripts": [
    "mlab=install.make_lab:mlab",
    "rlab=install.run_lab:rlab",
    "clab=install.clear_lab:clab"
]

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

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

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 命令后的实验室结构。在打包之前,一切似乎都运行良好。

【问题讨论】:

    标签: python import pip packaging dynamic-import


    【解决方案1】:

    你快到了。您必须完成函数参数的填写。您可能需要将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')
    

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2018-12-14
      • 2020-09-25
      • 1970-01-01
      • 2018-02-11
      • 2020-12-03
      相关资源
      最近更新 更多