>>> import subprocess
>>> subprocess.call('dir', shell=True)
0
如您所见,它给出返回代码的值,而不是的输出dir
。另外,它会等到命令完成,这样
>>> subprocess.call('date', shell=True)
将等待您输入新日期。
如果要捕获输出,请使用subprocess.check_output
。type
例如,DOS命令将打印出文件的内容。因此,假设您的文件info2.txt
包含用户名,则可以执行以下操作:
>>> import subprocess
>>> path = r'd:\info2.txt'
>>> output = subprocess.check_output(['type', path], shell=True)
>>> print output
Vinu
有关使用Python调用外部命令的所有方式,请参见此相关问题的全面概述,subprocess
具体有关更多信息,请参阅DougHellmann的本文。
os.system("some_command < input_file | another_command > output_file")
但是,尽管这样做很方便,但是您必须手动处理转义字符(例如空格等)的外壳字符。另一方面,这还允许您运行仅是外壳程序命令而不是外部程序的命令。请参阅文档。
stream = os.popen("some_command with
args”)os.system除了会为您提供类似于文件的对象之外,您可以使用该对象来访问该过程的标准输入/输出,它的作用与之相同。Popen还有其他3种变体,它们对I / O的处理略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递到外壳程序;如果将它们作为列表传递,则无需担心转义任何内容。请参阅文档。
模块的Popen
类subprocess
。它旨在替代它,os.popen但缺点是由于太全面而使它稍微复杂一些。例如,您会说:
print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
代替:
print os.popen("echo Hello World").read()
但是将所有选项都放在一个统一的类中而不是4个不同的popen函数是一个很好的选择。请参阅文档。
return_code = subprocess.call("echo Hello World", shell=True)
请参阅文档。
如果您使用的是Python 3.5或更高版本,则可以使用新subprocess.run函数,该函数与上面的代码非常相似,但更加灵活,并CompletedProcess在命令完成执行后返回一个对象。
os模块还具有您在C程序中拥有的所有fork / exec / spawn函数,但是我不建议直接使用它们。
该subprocess模块可能应该是您所使用的模块。
最后,请注意,对于所有方法,在这些方法中,您将要由shell执行的最终命令作为字符串传递给您,并且您有责任对其进行转义。如果您传递的字符串的任何部分不能被完全信任,则将带来严重的安全隐患。例如,如果用户正在输入字符串的某些/任何部分。如果不确定,请仅将这些方法与常量一起使用。为了给您暗示的含义,请考虑以下代码:
print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()