我一直在使用以下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)
但是这会将图像保存为某种无法读取的文件格式
关于可能出什么问题的任何想法?还是我可以尝试做些什么,让我既保存文件又检查成功状态?
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)
但是,(同时使用run
和check_output
时,shell=True
具有很大的安全风险……尤其是当input_params
从外部进入Python脚本时)。人们可以传递不需要的命令,并在脚本许可的情况下在外壳程序中运行它们。有时,
shell=True
是OS命令正常运行所必需的,在这种情况下,最好的建议是使用实际的Python模块与扫描仪进行交互-而不是让Python将OS命令传递给OS。