python - 在 Python 中调用另一个已安装的包

标签 python pip

我是 Python 新手。我想做的是在设置之后 esptool package (pip install esptool) 在我的应用程序中用一堆参数调用它的主要方法。像这样的东西:

esptool.py -p /dev/ttyUSB0 write_flash -fm qio 0x0000

我遇到了一个问题。 esptool 不在要导入的 python 包列表中(它已经与 pip 一起安装)。我该如何使用 import 并调用 main 方法?

最佳答案

解决导入问题

您不能简单地调用 import esptool 因为 esptool.py 是一个可执行脚本,因此并不意味着像普通模块一样被导入。但是,有从可执行脚本导入代码的变通方法;这是我知道的两个:

扩展sys.path

您可以扩展 sys.path 以包含包含 esptool.py 脚本的 bindir。从命令行进行简单检查:

$ PYTHONPATH=$(which esptool.py)/.. python -c "import esptool; esptool.main()"

应该向您打印使用帮助文本。

在代码中扩展sys.path:

import os
import sys

try:
    from shutil import which
except ImportError:
    from distutils.spawn import find_executable as which


bindir = os.path.dirname(which('esptool.py'))
sys.path.append(bindir)  # after this line, esptool becomes importable

import esptool


if __name__ == '__main__':
    esptool.main()

使用进口机械

您可以通过使用从任意文件导入 Python 代码的机制来避免扩展 sys.path。我更喜欢这个解决方案,而不是摆弄 sys.path,但不幸的是,它不能在 Python 2 和 3 之间移植。

python 3.5+

import importlib.machinery
import importlib.util

from shutil import which


if __name__ == '__main__':
    loader = importlib.machinery.SourceFileLoader('esptool', which('esptool.py'))
    spec = importlib.util.spec_from_loader(loader.name, loader)
    esptool = importlib.util.module_from_spec(spec)
    loader.exec_module(esptool)  # after this line, esptool is imported

    esptool.main()

python 2.7

import imp
from distutils.spawn import find_executable as which


if __name__ == '__main__':
    esptool = imp.load_source('esptool', which('esptool.py'))
    esptool.main()

传递命令行参数

命令行参数存储在 sys.argv 列表中,因此您必须临时覆盖它以便将参数传递给主函数:

# assuming esptool is imported
import sys

if __name__ == '__main__':
    # save the current arguments
    argv_original = sys.argv[:]
    # overwrite arguments to be passed to esptool argparser
    sys.argv[:] = ['', '-p', '/dev/ttyUSB0', 'write_flash', '-fm', 'qio', '0x0000']
    try:
        esptool.main()
    except Exception:
        # TODO deal with errors here
        pass
    finally:  # restore original arguments
        sys.argv[:] = argv_original

关于python - 在 Python 中调用另一个已安装的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772342/

相关文章:

python - 如何在 python 3 中检查字符串是否为 100% ascii

python - 如何在 Pandas 中过滤分组依据

python - 从对象创建 python 对象

python - 无法在 Ubuntu Linux 中使用 pip 安装 Python 包 : InsecurePlatformWarning, SSLError,tlsv1 警报协议(protocol)版本

python - pyodbc 安装不支持 python 3.5.1

python - 上下文管理器可以在 Python 中多次运行包含的 block 吗?

python - 用一个值替换一系列值

python - Pip 错误 - 找不到满足 junos-eznc 要求的版本

python-3.x - pip vs python -m pip 为什么 pip 命令抛出模块对象不可调用错误

Python: "No module named '请求'“在pipenv中的pip3安装请求之后