Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用子进程包装cmd.exe_Python_Windows_Subprocess - Fatal编程技术网

Python 用子进程包装cmd.exe

Python 用子进程包装cmd.exe,python,windows,subprocess,Python,Windows,Subprocess,我尝试用下面的程序在windows下包装cmd.exe,但它不起作用,它似乎在等待什么,并且没有显示任何内容。你知道这里怎么了吗 import subprocess process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None) process.stdin.write("dir\r\n") output = process.stdou

我尝试用下面的程序在windows下包装cmd.exe,但它不起作用,它似乎在等待什么,并且没有显示任何内容。你知道这里怎么了吗

import subprocess

process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)  
process.stdin.write("dir\r\n")  
output = process.stdout.readlines()  
print output

通常,在尝试使用实际命令调用命令提示符时,只使用“/k”参数调用命令提示符比通过stdin传递命令更简单。也就是说,只需调用“cmd.exe/k dir”。比如说,

from os import *
a = popen("cmd /k dir")
print (a.read())
下面的代码也做了同样的事情,但缺少一个字符串供您操作,因为它直接通过管道输出:

from subprocess import *
Popen("cmd /k dir")

顺便说一句,如果您的实际任务是列出目录,请使用Python自己的操作系统模块,例如os.listdir()或glob模块。。。等等。不要像那样不必要地调用系统命令。它使您的代码不可移植。

这会锁定,因为
process.stdout.readlines()
读取进程的所有输出(直到它终止)。由于cmd.exe仍在运行,它会一直等待它关闭


要解决这个问题,您可以启动一个单独的线程来读取进程输出。如果不调用
communicate()
,则无论如何都需要这样做,以避免可能的死锁。这个线程可以反复调用
process.stdout.readline()
,并处理数据或将其发送回主线程进行处理。

+1,打印输出比我使用op的代码收到的结果更可读。是的,这是可行的,但我需要能够围绕cmd.exe shell编写一个解释器循环。这就是为什么我想重定向stdinoustdout。你知道如何做到这一点而不必每次都掏壳吗?是的,我的问题应该更准确。如上所述,这个想法是将shell包装在一个iterp循环中(可以是cmd.exe,作为bash for inst的其他内容)。我已经能够按照您的建议执行,但是知道如何同步输入和输出吗?如何在查看下一个命令之前确保上一个命令问题已经完成。我不认为有一个解决方案可以100%解决这个问题,因为子流程没有“等待下一个命令”的概念。我想您可以尝试检测cmd.exe提示符,但这是一个相当复杂的问题,而且不总是有效的。
process = subprocess.Popen('cmd.exe /k ', shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)
process.stdin.write("dir\n")
o,e=process.communicate()
print o
process.stdin.close()