Python 子进程被 "echo y"管道破坏

标签 python subprocess

为什么当我尝试在子进程中使用 echo 传递 yes 回复时命令会中断,但当我手动将其输入到命令提示符中时却工作得很好?

请注意,我尝试了带空格和不带空格的结果,但结果是相同的,但是如果您将其中任何一个完全按照您所看到的那样放入命令提示符中,它就会起作用,而不是给出错误

WindowsError: [错误2]系统找不到指定的文件

<小时/>

Python Interpreter Output

C:\Windows\System32>python
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> p = subprocess.Popen("echo y|cacls {0} /d SYSTEM".format("C:\\ProgramData\\Microsoft\\Diagnosis\\ETLLogs\\AutoLogger\\AutoLogger-Diagtrack-Listener.etl", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\subprocess.py", line 390, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 640, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
>>> p = subprocess.Popen("echo y|cacls {0} /d SYSTEM".format("C:\ProgramData\Microsoft\Diagnosis\ETLLogs\AutoLogger\AutoLogger-Diagtrack-Listener.etl", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\subprocess.py", line 390, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 640, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
>>> p = subprocess.Popen("echo y| cacls {0} /d SYSTEM".format("C:\\ProgramData\\Microsoft\\Diagnosis\\ETLLogs\\AutoLogger\\AutoLogger-Diagtrack-Listener.etl", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\subprocess.py", line 390, in __init__
    errread, errwrite)
  File "C:\Python27\lib\subprocess.py", line 640, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
>>> p = subprocess.Popen("cacls {0} /d SYSTEM".format("C:\\ProgramData\\Microsoft\\Diagnosis\\ETLLogs\\AutoLogger\\AutoLogger-Diagtrack-Listener.etl", stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE))
>>> Are you sure (Y/N)?

请注意,当我完全删除回声时,它在最后起作用,但随后我永远无法真正完成运行它,因为它永远不会得到“yes”(echo y|)回复......并且不幸的是,命令中没有内置 /yes 开关。

最佳答案

看起来这个问题与此类似:How to use Subprocess in Windows

“echo”不是程序,而是 shell 的内置功能,因此需要指令“shell=True”才能实现正确的功能,因此您的命令应该是:

p = subprocess.Popen("echo y|cacls {0} /d SYSTEM".format("C:\\ProgramData\\Microsoft\\Diagnosis\\ETLLogs\\AutoLogger\\AutoLogger-Diagtrack-Listener.etl", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE))

这也是错误的原因(因为 echo),并且因为 cacls 是程序,所以它在生成错误后运行(没有您需要的 echo y| )

关于Python 子进程被 "echo y"管道破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43670254/

相关文章:

python - 在 python 子进程中使用 setenv

python - django读取文件以导入详细信息

python - 导入 _counter 形式的 pycrypto 库时出错

python - 程序重新启动时,python 子进程管道可以重新连接到原始子进程吗?

python 3.4子进程

python - 为什么此 Python 子进程命令仅在 Windows 上的 shell=True 时有效?

python - 需要在 python 中通过 espeak 和 aplay 命令使用 os.system 中的变量

python - 如何在 models.py django 中添加子类别

python - 如果另一列是 NaN,如何替换列中的值?

python - Netmiko send_config_set - 解析响应 - 检测错误?