从Python在Windows CMD中执行命令有什么问题?

从Python在Windows CMD中执行命令有什么问题?,python,windows,cmd,popen,Python,Windows,Cmd,Popen,我在从Python向CMD传递命令时遇到了很大的麻烦 首先,我打开一个CMD进程: cmdprocess = subprocess.Popen("cmd", stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subp

我在从Python向CMD传递命令时遇到了很大的麻烦

首先,我打开一个CMD进程:

    cmdprocess = subprocess.Popen("cmd",
                                  stdin  = subprocess.PIPE,
                                  stdout = subprocess.PIPE,
                                  stderr = subprocess.PIPE)
然后,我做了一些事情,例如:

for i in range(500):
     #time.sleep(1)
     command = ("dir > " + os.path.join("C:\\", str(i)) + "\r\n").encode("utf-8")
     print(command)
     cmdprocess.stdin.write(command)
所以这应该在一个文件夹中创建500个小文本文件。我在Python3.2x64和3.2x86中测试了它,结果都是:在Pythonshell中,它的计数大约为250-350,然后停止。没有错误,什么都没有。然后,指定文件夹中有文件1-80

现在,我认为Python可能太快了,所以在两个命令之间休眠1秒钟。现在,在第一个文件出现在文件夹中之前,它的计数高达200左右!然后在270左右停下来


这里发生了什么?我如何强制CMD立即执行命令?

您是否在管道中处理输出?它们可能正在填充。如果从进程中填充stdout或stderror缓冲区,它将停止执行。

是否在管道中处理输出?它们可能正在填充。如果您从进程中填充stdout或stderror缓冲区,它将停止执行。

我认为您最好使用pywin32包。有win32pipe和win32process模块。 我也有同样的问题,但我不能解决它没有pywin32网站包。。。 所以现在我正在使用它们。。。如果您需要示例代码并且正在使用windows,我将附加它。
如果你是说linux。。。它是一样的,但您需要另一个类似IO select的软件。

我认为您最好使用pywin32软件包。有win32pipe和win32process模块。 我也有同样的问题,但我不能解决它没有pywin32网站包。。。 所以现在我正在使用它们。。。如果您需要示例代码并且正在使用windows,我将附加它。
如果你是说linux。。。它是一样的,但你需要另一个像IO select一样的。

不,我不是。。。但是如果我只是手动一个接一个地运行命令,它也不会生成任何输出。这些文件就是不出现。从管道读取的问题是,如果我想读取比已写入的字符更多的字符,它会中断程序。我没有在文件的末尾得到一个a,read1只是阻塞…我只是尝试了peek,它可以工作,但我只看到绝对没有输出。。。这向我暗示了一个可能的解决方案:我可能尝试在输入流上刷新…尝试使用cmdprocess=subprocess.Popencmd,stdin=subprocess.PIPE,shell=True@Bo:我试过了,现在它在停止之前显示cmdprocess.stdin.writecommand IOError:[Errno 22]无效参数。知道那里出了什么问题吗?这是否意味着stdin作为第一个隐式的写作参数突然不存在了?我想我正在尝试这个调试器…从我所拥有的,它一直运行到499,在它不允许我直接在c:\上写入文件之前,我只得到了拒绝访问的错误:\n这是我得到的完整代码导入子进程导入os cmdprocess=subprocess.Popencmd,stdin=subprocess.PIPE,shell=True,适用于范围500中的i:command=dir>+os.path.joinC:\\,stri+\r\n.encodeutf-8 printcommand cmdprocess.stdin.writecommandNo,我不是。。。但是如果我只是手动一个接一个地运行命令,它也不会生成任何输出。这些文件就是不出现。从管道读取的问题是,如果我想读取比已写入的字符更多的字符,它会中断程序。我没有在文件的末尾得到一个a,read1只是阻塞…我只是尝试了peek,它可以工作,但我只看到绝对没有输出。。。这向我暗示了一个可能的解决方案:我可能尝试在输入流上刷新…尝试使用cmdprocess=subprocess.Popencmd,stdin=subprocess.PIPE,shell=True@Bo:我试过了,现在它在停止之前显示cmdprocess.stdin.writecommand IOError:[Errno 22]无效参数。知道那里出了什么问题吗?这是否意味着stdin作为第一个隐式的写作参数突然不存在了?我想我正在尝试这个调试器…从我所拥有的,它一直运行到499,在它不允许我直接在c:\上写入文件之前,我只得到了拒绝访问的错误:\n这是我得到的完整代码导入子进程导入os cmdprocess=subprocess.Popencmd,stdin=subprocess.PIPE,shell=True,适用于范围500中的i:command=dir>+os.path.joinC:\\,stri+\r\n.encodeutf-8 printcommand cmdprocess.stdin.writecommands使用subprocess而不是标准Python工具创建文件有什么原因吗?是的,当然了:我实际上是在使用mklink命令创建指向文件的符号链接。我只是尝试将问题简化为一个更小、更通用的命令,它更易于编写,并且不需要任何先决条件。这两个命令中的问题是相同的。您使用subprocess而不是标准Python工具来创建文件有什么原因吗?是的,当然有:我实际上使用mklink命令来创建指向文件的符号链接。我只是试图将问题简化为一个更小、更通用的命令,它更易于编写,并且不需要任何prerequ 伊塞特。这两个命令的问题是相同的。它相当长。。。请看,它很长。。。请结帐