在Python for循环中使用subprocess.call()时行为不稳定
在我下面附带的脚本中,我尝试使用Python实现一个非常简单的过程按顺序执行本机Windows命令,以及从免费、便携程序调用可执行文件。但是在Python for循环中使用subprocess.call()时行为不稳定,python,for-loop,cmd,subprocess,Python,For Loop,Cmd,Subprocess,在我下面附带的脚本中,我尝试使用Python实现一个非常简单的过程按顺序执行本机Windows命令,以及从免费、便携程序调用可执行文件。但是subprocess.call()函数未按预期运行 我正在经历的行为: ~调用ONE变量,然后像我期望的那样停止/等待,但当我退出ONE(taskmgr)时,它同时启动TWO和TWO,然后等待 ~当我退出THREE时,它同时调用两个可移植程序FOUR和FIVE,并等待 ~然后启动SIX并等待 ~最后,它会在不暂停的情况下同时执行其余的命令 对这种行为的原因有
subprocess.call()
函数未按预期运行
我正在经历的行为:
~调用ONE
变量,然后像我期望的那样停止/等待,但当我退出ONE
(taskmgr)时,它同时启动TWO
和TWO
,然后等待
~当我退出THREE
时,它同时调用两个可移植程序FOUR
和FIVE
,并等待
~然后启动SIX
并等待
~最后,它会在不暂停的情况下同时执行其余的命令
对这种行为的原因有什么解释吗?和/或实现相同结果的建议解决方案
import subprocess
def AutoCommands():
ONE = 'taskmgr /0 /startup'
TWO = 'taskschd.msc'
THREE = 'services.msc'
FOUR = '"%CD%/FolderDirectory/PortableProgram" -custom -flags'
FIVE = '"%CD%/FolderDirectory/PortableProgram2" -more -flags'
SIX = '"%CD%/FolderDirectory/PortableProgram3" -more -flags'
SEVEN = '"appwiz.cpl"'
EIGHT = 'wuapp'
autocommands = [ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT]
for command in autocommands:
subprocess.call(command, shell=True)
AutoCommands()
编辑:我希望/希望执行每个命令,但在当前命令被取消/终止之前,不要移动到下一个命令。类似于使用start/wait program.exe和&program2.exe
等。。。我已经在.bat
中编写了上述脚本,它按照您的预期运行,在命令之间等待。但是,如果我尝试使用os.system()
或subprocess.Popen()
执行该.bat
,它会表现出相同的行为。如果我直接尝试使用os.system(“start/wait program.exe&&start/wait program2.exe”)
它会表现出相同的行为
我还尝试了使用
subprocess.Popen
(不是我想要使用的)的建议,但根本无法使其起作用。打印subprocess.call的返回代码;确保它们没有出错。如果在Windows控制台中手动运行完全相同的命令,会发生什么情况。如果从Python运行命令,您是否希望得到不同的结果?运行:子流程。检查\u调用(“\n”。join(autocommands),shell=True)
(如果失败,请尝试”;“
或”&“”,而不是”。\n“
)。当我手动执行命令时,它会执行我希望它执行的操作。是的,我希望在Python中运行时会得到不同的结果,因为.call()
函数。我希望它执行一个命令并等待该命令被取消/退出。类似于在此处使用启动/等待命令
或使用&&
等。。。我甚至试着用上面的脚本示例制作一个.bat
文件,它工作得很好(在命令之间等待),但是即使我使用os.system(./batchfile.bat)
或subprocess.Popen(./batchfile.bat)打开.bat
它具有与问题中提到的相同的初始行为。此外,您建议的命令只是将指定字符放在每个命令的每个字母之间,并返回一个“非零退出状态”@bigenerary:1。如果手动运行该命令时没有立即返回,那么在Python中也不会立即返回(如果使用check\u call()
)。2.“将指定字符放在每个字母之间”--不,不会<代码>自动命令是一个列表:“&”.join([“第一”、“第二”])
->“第一和第二”
。我最好的猜测是您的命令无法启动,这就是为什么您会看到它们立即返回的原因,这就是为什么我建议check\u call()
引发异常,而不是默默地忽略错误。