如何使用subprocess.run()在Python中运行cmd命令

如何使用subprocess.run()在Python中运行cmd命令,python,subprocess,Python,Subprocess,在C:\Program Files\Java\jdk-11.0.10\bin\javaw.exe “@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV.temp-ChargerLocation-args-1617369801473.txt” 在cmd中,我只需移动到C:\ProgramFiles\Java\jdk-11.0.10\bin\javaw.exe,然后执行“@C:\Users\danie\

C:\Program Files\Java\jdk-11.0.10\bin\javaw.exe

“@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV.temp-ChargerLocation-args-1617369801473.txt” 在cmd中,我只需移动到
C:\ProgramFiles\Java\jdk-11.0.10\bin\javaw.exe
,然后执行
“@C:\Users\danie\IdeaProjects\EV\u example\EV\u example\matsim libs\contribs\EV\.temp-ChargerLocation-args-1617369801473.txt”
。它应该包括引号,以便正确运行

但是,当我使用
子进程.run([“cd C:\Program Files\Java\jdk-11.0.10\bin\javaw.exe”,“@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV\.temp-ChargerLocation-args-1617369801473.txt]”)时,
该命令似乎与双引号混淆(见附图)


是否有任何方法可以像在我的cmd中一样运行它,但可以从Python调用它?

为了避免这种情况,可以使用两种不同的方法。第一种方法就是避开所有的内部引用,比如

subprocess.run([r"cd C:\Program Files\Java\jdk-11.0.10\bin\javaw.exe",
    r"\"@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim-libs\contribs\ev\.temp-ChargerLocation-args-1617369801473.txt\""])
第二个-如果需要双引号,则用于字符串单引号。Python对单引号和双引号表示字符串没有任何区别

subprocess.run([r'cd C:\Program Files\Java\jdk-11.0.10\bin\javaw.exe',
    r'"@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim-libs\contribs\ev\.temp-ChargerLocation-args-1617369801473.txt"'])
从本质上讲,没有理由将
cd
放在特定目录下运行二进制文件位于该目录中的命令(另请参见),但如果确实需要,请使用
cwd
关键字参数来运行
subprocess.run()

subprocess.run([r“C:\ProgramFiles\Java\jdk-11.0.10\bin\javaw.exe”,
r“@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV\.temp-ChargerLocation-args-1617369801473.txt”,
#可能完全没有必要
cwd=r“C:\ProgramFiles\Java\jdk-11.0.10\bin”,
#也许也是个好主意
检查=真)

在没有
shell=True
的情况下,命令字符串中不需要或不需要显式引用(尽管注意原始字符串,以便正确地通过文字反斜杠)。

可以使用\Please小对比度图像对Python代码中的字符进行转义,这会造成伤害,而且应该已经说服你为什么TTI是个坏主意。老实说,我会用
os.system
在shell中运行命令。@coderman1234,我用os.system这样运行它:
os.system(r'“java.exe@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV\.temp-ChargerLocation-args-1617369801473.txt”
然而,尽管这工作得很好,但我正试图对另一个java类做完全相同的思考:
os.system(r''java.exe@C:\Users\danie\IdeaProjects\EV_example\EV_example\matsim libs\contribs\EV\.temp-myruneveexample-args-1617459572859.txt“)
但是对于这一个,我得到了错误:文件名、目录名或卷标语法不正确。位置和所有内容都是一样的。如何在Python中运行以下命令
/zhome/9e/b/129343/Maven/apache-Maven-3.6.3/bin/mvn exec:java-Dexec.mainClass=“org.matsim.contrib.ev.example.MyRunEvExample“
?引号有问题。请完全删除引号;shell也会将命令解析成这样
subprocess.run([“/zhome/9e/b/129343/Maven/apache-Maven-3.6.3/bin/mvn”,“exec:java“,”-Dexec.mainClass=org.matsim.contrib.ev.example.MyRunEvExample“])
并可能在右括号前添加
check=True
。您可以使用
printf'%s\n'/zhome/9e/b/129343/Maven/apache-Maven-Maven-3.6.3/bin/dexn-exec:java-mainClass-=“org.matsim.contrib.ev.example.MyRunEvExample”
查看此操作。如果确实要查看尾随空格等,请尝试使用格式字符串
“%q”\n'