我如何将我的shell扫描脚本嵌入到Python脚本中?

问题描述 投票:0回答:1

我一直在使用以下shell命令从名为scanner_name的扫描仪读取图像并将其保存在名为file_name的文件中

scanimage -d <scanner_name> --resolution=300 --format=tiff --mode=Color 2>&1 > <file_name>

对于我来说,这很好用。我现在正尝试将其嵌入python脚本中。我需要的是像以前一样将扫描的图像保存到文件中,并且还将任何标准输出(例如错误消息)捕获到字符串中

我已经尝试过

    scan_result = os.system('scanimage -d {} --resolution=300 --format=tiff --mode=Color 2>&1 > {} '.format(scanner, file_name))

但是当我循环运行(使用不同的扫描仪)时,两次扫描之间的间隔会过长,并且直到下一次扫描开始之前图像都不会保存(该文件被创建为空文件,直到被填充为止下一个扫描命令)。所有这一切都具有scan_result = 0,即表示没有错误

已经向我建议了子过程方法run(),并且我已经尝试过

with open(file_name, 'w') as scanfile:

    input_params = '-d {} --resolution=300 --format=tiff --mode=Color 2>&1 > {} '.format(scanner, file_name)
    scan_result = subprocess.run(["scanimage", input_params], stdout=scanfile, shell=True)

但是这会将图像保存为某种无法读取的文件格式

关于可能出什么问题的任何想法?还是我可以尝试做些什么,让我既保存文件又检查成功状态?

python shell scanning
1个回答
0
投票
我怀疑问题是您正在打开输出文件,然后在其中运行subprocess.run()。没必要最终结果是,您要通过Python打开文件,然后让命令通过OS打开文件

再次,然后通过Python关闭文件。

JUST

运行子进程,并让scanimage 2>&1> filename命令创建文件(就像直接在命令行上运行scanimage一样。)我认为subprocess.check_output()现在是捕获输出的首选方法。

from subprocess import check_output # Command must be a list, with all parameters as separate list items command = ['scanimage', '-d{}'.format(scanner), '--resolution=300', '--format=tiff', '--mode=Color', '2>&1>{}'.format(file_name)] scan_result = check_output(command) print(scan_result)

但是,(同时使用runcheck_output时,shell=True具有很大的安全风险……尤其是当input_params从外部进入Python脚本时)。人们可以传递不需要的命令,并在脚本许可的情况下在外壳程序中运行它们。

有时,shell=True是OS命令正常运行所必需的,在这种情况下,最好的建议是使用实际的Python模块与扫描仪进行交互-而不是让Python将OS命令传递给OS。

© www.soinside.com 2019 - 2024. All rights reserved.