当前位置: 首页 > 面试题库 >

Windows上的Python 2.7.2中使用subprocess.call()的问题

范稳
2023-03-14
问题内容

我正在尝试以下操作,并因错误而失败。我试图通过在控制台上调用python在Windows控制台上从Python shell
/从脚本/运行它。似乎没有任何作用。总是相同的错误。

from subprocess import call
>>>pat = "d:\info2.txt"

>>> call(["type",pat])

>>>Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    call(["type",pat])
  File "C:\Python27\lib\subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "C:\Python27\lib\subprocess.py", line 679, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 893, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

有谁知道这是怎么回事。!! ???

即使是call(["date"]]没有任何争论的简单事物,也会因相同的错误而失败。

我正在Windows 7机器上使用Python 2.72 32位版本。


问题答案:

添加shell=True到呼叫:

>>> import subprocess
>>> subprocess.call('dir', shell=True)
0

如您所见,它给出返回代码的值,而不是的输出dir。另外,它会等到命令完成,这样

>>> subprocess.call('date', shell=True)

将等待您输入新日期。

编辑:
如果要捕获输出,请使用subprocess.check_outputtype例如,DOS命令将打印出文件的内容。因此,假设您的文件info2.txt包含用户名,则可以执行以下操作:

>>> import subprocess
>>> path = r'd:\info2.txt'
>>> output = subprocess.check_output(['type', path], shell=True)
>>> print output
Vinu

有关使用Python调用外部命令的所有方式,请参见此相关问题的全面概述,subprocess具体有关更多信息,请参阅DougHellmann的本文。

下面总结了调用外部程序的方式以及每种方法的优缺点:

  1. os.system("some_command with args”)将命令和参数传递到系统的外壳程序。很好,因为您实际上可以以这种方式一次运行多个命令,并设置管道和输入/输出重定向。例如:
os.system("some_command < input_file | another_command > output_file")  

但是,尽管这样做很方便,但是您必须手动处理转义字符(例如空格等)的外壳字符。另一方面,这还允许您运行仅是外壳程序命令而不是外部程序的命令。请参阅文档。

  1. stream = os.popen("some_command with args”)os.system除了会为您提供类似于文件的对象之外,您可以使用该对象来访问该过程的标准输入/输出,它的作用与之相同。Popen还有其他3种变体,它们对I / O的处理略有不同。如果您将所有内容都作为字符串传递,那么您的命令将传递到外壳程序;如果将它们作为列表传递,则无需担心转义任何内容。请参阅文档。

  2. 模块的Popensubprocess。它旨在替代它,os.popen但缺点是由于太全面而使它稍微复杂一些。例如,您会说:

print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()

代替:

print os.popen("echo Hello World").read()

但是将所有选项都放在一个统一的类中而不是4个不同的popen函数是一个很好的选择。请参阅文档。

  1. call来自subprocess模块的功能。基本上就像Popen类一样,并接受所有相同的参数,但是只是等待命令完成并提供返回代码。例如:
return_code = subprocess.call("echo Hello World", shell=True)  

请参阅文档。

  1. 如果您使用的是Python 3.5或更高版本,则可以使用新subprocess.run函数,该函数与上面的代码非常相似,但更加灵活,并CompletedProcess在命令完成执行后返回一个对象。

  2. os模块还具有您在C程序中拥有的所有fork / exec / spawn函数,但是我不建议直接使用它们。

该subprocess模块可能应该是您所使用的模块。

最后,请注意,对于所有方法,在这些方法中,您将要由shell执行的最终命令作为字符串传递给您,并且您有责任对其进行转义。如果您传递的字符串的任何部分不能被完全信任,则将带来严重的安全隐患。例如,如果用户正在输入字符串的某些/任何部分。如果不确定,请仅将这些方法与常量一起使用。为了给您暗示的含义,请考虑以下代码:

print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()

并想象用户输入了“我的妈妈不爱我&& rm -rf /”这可能会擦除整个文件系统的信息。



 类似资料:
  • 问题内容: 我收到以下错误: 我的代码是: Windows 7,64位。Python 3.x最新,稳定。 有任何想法吗? 谢谢, 问题答案: 当命令是内置的shell时,请在调用中添加“ shell = True”。 例如,您将输入: 引用文档: 在Windows上唯一需要指定shell = True的时间是将要执行的命令内置到shell中(例如dir或copy)。您不需要shell = True

  • 我需要全局热键支持我的Java应用程序。 我想出了一些代码(大部分是复制的),但它不起作用。 HotkeyManager.java: 用户32。爪哇: msg. java: 它确实注册了热键(当程序运行时,按系统中的“F”键不会产生任何结果),但我从未得到任何到控制台的输出。发生了什么?我也知道jintellitype和jnativehook。我不能使用first,至于second,它总是监听所有

  • 问题内容: 我想做的很简单。我想使用python的模块调用以下命令。 该命令可以简单地工作并将其内容复制到当前工作目录中。但是,当我尝试在脚本中使用模块调用此命令时,会出错。以下是我在做什么: 我收到以下错误: 我究竟做错了什么 ?如何在子流程模块命令中使用大于运算符? 问题答案: 输出重定向是一个 shell 功能,但是带有列表并且(默认)不使用shell。 您必须在这里使用: 或更妙的是,用于

  • 我正在尝试在Windows 10家庭版上安装迷你库贝。我没有Hyper-V,但我知道我仍然可以使用迷你库贝作为远程Docker守护进程以及本地库伯内特集群。 迷你们 巧克力 我感谢你的帮助。当我尝试启动minikube时,我得到以下错误: 那么我做错了什么?

  • 问题内容: 我正在尝试连接到在Cloudera上运行的HDFS实例。我的第一个步骤启用Kerberos和创建Keytabs(如图所示这里)。 在下一步中,我想使用密钥表进行身份验证。 它失败并显示以下错误 java.io.IOException:从keytab /etc/hadoop/conf/hdfs.keytab登录hdfs @ CLOUDERA失败:javax.security.auth.l

  • 问题内容: 当我使用python.exe运行它时,我有一些Python代码可以正常运行,但是如果使用pythonw.exe,则失败。 我收到的消息是: 但是,如果我未指定’stdout’参数,则subprocess.call()会开始正常。 我可以看到pythonw.exe可能正在重定向输出本身,但是我看不到为什么我被阻止为新线程指定stdout。 问题答案: 和handle无效,因为python