使用 subprocess 调用 python 脚本并且打印执行脚本的 output 一般写法。
import subprocess
import sys
import os
import logging
def main():
# 设置环境变量
os.environ['PYTHONIOENCODING'] = 'utf-8'
# 在 Windows 终端中设置代码页为 UTF-8
if os.name == 'nt':
os.system('chcp 65001')
# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[
logging.StreamHandler(sys.stdout)
])
logger = logging.getLogger()
logger.info("在python脚本运行该指令")
logger.info("python ./tools/onnx_infer.py -i ./workspace/input -m ./models/AnimeGANv3_Shinkai_37.onnx -o ./workspace/output --background")
logger.info("output 编码为utf-8")
result = subprocess.run(
[sys.executable, "./tools/onnx_infer.py", "-i", "./workspace/input", "-m", "./models/AnimeGANv3_Shinkai_37.onnx", "-o", "./workspace/output", "--background"],
shell=True,
capture_output=True,
text=True,
encoding='utf-8',
universal_newlines=True
)
logger.info(result.stdout)
logger.error(result.stderr)
if __name__ == "__main__":
main()
注意:
- 如果被调用的脚本没有写在
if __name__ == "__main__":
下方,会出现脚本嵌套调用时,被视为独立线程而不等待执行结束直接跳过执行下一步的情况。
所以要写subprocess.run,最好把要运行的都写一个main,然后调用。
- 工作目录和系统路径
在相对路径的引用上,依然是以你的工作目录为准,一般为根目录,不会改变。
但是在被调用的文件中进行import上级目录,会出现 module not found 的问题,这时候应该先import sys,然后将上级目录添加到sys.path中,然后就可以正常的引用了。这个是相对于被subprocess执行的文件而言。
依然存在的问题[执行脚本日志乱码]:
默认调用subprocess.run是不会反馈出执行脚本的输出的。
这里使用stdout来打印,但是依然存在的问题是,如果调用脚本里面也存在logging,在某些终端会有日志乱码的情况。暂未解决,但不影响使用。
这个在minidonda的promot中不会有乱码。pycharm的终端中乱码。