Python 如何转换;命令模块";变成;子流程模块";?

Python 如何转换;命令模块";变成;子流程模块";?,python,python-3.x,Python,Python 3.x,我想知道如何使用“子流程模块”重写以下代码: import commands print commands.getoutput('convert -quality 100 ___t*.png images/transient_heat.gif') print commands.getoutput('rm ___t*.png') 因为“命令模块”不支持Python3,所以我想使用“子流程模块”。我尝试了以下代码,但不起作用 import subprocess print ( subprocess

我想知道如何使用“子流程模块”重写以下代码:

import commands
print commands.getoutput('convert -quality 100 ___t*.png images/transient_heat.gif')
print commands.getoutput('rm ___t*.png')
因为“命令模块”不支持Python3,所以我想使用“子流程模块”。我尝试了以下代码,但不起作用

import subprocess
print ( subprocess.Popen('convert -quality 100 ___t*.png images/transient_heat.gif') )
print ( subprocess.Popen('rm ___t*.png') )
多谢各位!代码最初取自Kitchin的博客:

您可以使用

你可以用


子流程
需要组成命令的字符串列表。您可以手动拆分命令,如下所示:

import subprocess
print(subprocess.Popen(['convert', '-quality', '100', '___t*.png', 'images/transient_heat.gif']))
print (subprocess.Popen(['rm', '___t*.png']))
或者,您可以让
shlex.split()
为您完成以下工作:

import shlex
import subprocess
print (subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif')))
print (subprocess.Popen(shlex.split('rm ___t*.png')))
编辑

以下代码将在执行时向您显示
stdout
stderr
的输出,这可能有助于修复命令行中的任何错误

import shlex
import subprocess

convert_proc = subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif'), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = convert_proc.communicate()
print('STDOUT: {}'.format(outs))
print('STDERR: {}'.format(errs))

subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif'))
print (subprocess.Popen(shlex.split('rm ___t*.png')))

子流程
需要组成命令的字符串列表。您可以手动拆分命令,如下所示:

import subprocess
print(subprocess.Popen(['convert', '-quality', '100', '___t*.png', 'images/transient_heat.gif']))
print (subprocess.Popen(['rm', '___t*.png']))
或者,您可以让
shlex.split()
为您完成以下工作:

import shlex
import subprocess
print (subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif')))
print (subprocess.Popen(shlex.split('rm ___t*.png')))
编辑

以下代码将在执行时向您显示
stdout
stderr
的输出,这可能有助于修复命令行中的任何错误

import shlex
import subprocess

convert_proc = subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif'), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = convert_proc.communicate()
print('STDOUT: {}'.format(outs))
print('STDERR: {}'.format(errs))

subprocess.Popen(shlex.split('convert -quality 100 ___t*.png images/transient_heat.gif'))
print (subprocess.Popen(shlex.split('rm ___t*.png')))

你怎么知道它不起作用?编辑问题。@PeterWood我运行了代码,但无法生成输出文件“images/transient\u heat.gif”。非常感谢。你怎么知道它不起作用?编辑问题。@PeterWood我运行了代码,但无法生成输出文件“images/transient\u heat.gif”。非常感谢。否则,它将返回错误消息:
CalledProcessError:Command'convert-quality 100\uuuu t*.png images/transient\u heat.gif'返回非零退出状态4
。你能帮我一个忙吗?谢谢大家!@world2005您是否使用了
shell=True
是的,我使用了
shell=True
。代码是
子流程。检查输出(['convert'、'-quality'、'100'、'uuuuu t*.png'、'images/transient\u heat.gif']、shell=True)
子流程。检查输出(['rm\uuuuu t*.png'],shell=True)
。非常感谢。如果要传递命令列表,则不应使用shell。此外,列表中的每个项目应该只包含一个参数--
['rm','.\uuuuuu t*.png']
如果我没有,它将返回错误消息:
CalledProcessError:Command'convert-quality 100.\uuuuu t*.png images/transient\u heat.gif'返回非零退出状态4
。你能帮我一个忙吗?谢谢大家!@world2005您是否使用了
shell=True
是的,我使用了
shell=True
。代码是
子流程。检查输出(['convert'、'-quality'、'100'、'uuuuu t*.png'、'images/transient\u heat.gif']、shell=True)
子流程。检查输出(['rm\uuuuu t*.png'],shell=True)
。非常感谢。如果要传递命令列表,则不应使用shell。此外,列表中的每个项目应该只包含一个参数--
['rm','.\uuuu t*.png']
我尝试了这两个代码,但它们无法输出“'images/transient\u heat.gif”。非常感谢。尝试使用convert实用程序的完整路径,而不仅仅是“convert”。您可以通过从shell提示符执行“which convert”来找到完整的路径。我尝试了这两个代码,但它们无法输出“'images/transient_heat.gif”。非常感谢。尝试使用convert实用程序的完整路径,而不仅仅是“convert”。通过从shell提示符执行“which convert”,可以找到完整的路径。