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

2024-10-03 21:29:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还不熟悉。我要做的是在安装程序esptool包(pip install esptool)在我的应用程序中用一堆参数调用其主方法之后。比如:

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

我面临一个问题。esptool不在python中要导入的包列表中(它已经与pip一起安装)。如何使用import并调用main方法?你知道吗


Tags: installpip方法pydevimport应用程序列表
1条回答
网友
1楼 · 发布于 2024-10-03 21:29:07

解决导入问题

不能简单地调用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,但不幸的是,它在python2和python3之间是不可移植的。你知道吗

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列表中,因此您必须临时覆盖它才能将参数传递给main函数:

# 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

相关问题 更多 >