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

如何解决如何在 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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?