python - 在 Python 中调用另一个已安装的包
问题描述
我是 Python 新手。我想要做的是在我的应用程序中设置esptool包 ( pip install esptool
) 用一堆参数调用它的 main 方法。就像是:
esptool.py -p /dev/ttyUSB0 write_flash -fm qio 0x0000
我遇到了一个问题。esptool
不在 python 中要导入的包列表中(它已经与 pip 一起安装)。我将如何使用import
并调用主要方法?
解决方案
解决导入问题
您不能简单地调用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()
使用进口机械
sys.path
您可以通过使用从任意文件导入 Python 代码的机制来避免扩展。我喜欢这个解决方案,而不是摆弄 . 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()
蟒蛇 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:为什么事件调度程序一直在漂移,有没有办法解决这个问题?
- node.js - 如何在 Azure 门户的 AppInsights 中查看聊天机器人用户数
- wordpress - 带有 ACF 嵌套字段的 WP MetaQuery
- jquery - 如何检查ul容器中的所有元素是否显示:在Jquery中无
- scala - 如何使用 slick 创建数据库
- oracle - Oracle 时区 - 巴西 2018 年变更
- android - 尝试专注于 EditText 时出现问题
- excel - VBA:获取“编译错误 - 无效使用属性”
- c# - 如何将事件从控制台发送到窗口窗体C#
- javascript - 在CKEditor 5中动态调整粘性工具栏的位置