如何将文件名传递给从Python执行的外部命令?

时间:2011-09-08 20:25:43

标签: python windows

我正在尝试在Python脚本中执行命令:

import subprocess
output_process = 
   subprocess.Popen("javac -cp C:\Users\MyUsername\Desktop\htmlcleaner-2.2.jar Scrapping_lastfm.java",
                    shell=True, stdout=subprocess.PIPE)

但我收到错误package org.htmlcleaner does not exist

如果我独立运行javac命令,它执行正常..

我目前的工作指导是C:\Users\MyUsername

3 个答案:

答案 0 :(得分:1)

尝试

output_process = subprocess.Popen(["javac", "-cp", 
    "C:\Users\MyUsername\Desktop\htmlcleaner-2.2.jar", "Scrapping_lastfm.java"],
    shell=True, stdout=subprocess.PIPE, env={'ENVIRONMENTAL': '/variables/here'})

使用javac字典中正常运行env时与java相关的环境变量。 asgs建议你需要CLASSPATH

您不必将命令拆分为我刚才这样做的列表,以便更容易看到整个事情。

答案 1 :(得分:1)

python不会引发错误,而是由java子进程引发。很可能java机器没有找到一些库,并且很可能将问题简化为PATH配置问题 尚未在环境中设置变量CLASSPATH。解决:

import shlex

JAVA_COMMAND=r"javac -cp C:\\Users\\MyUsername\\Desktop\\htmlcleaner-2.2.jar Scrapping_lastfm.java"

cmdline = shlex.split(JAVA_COMMAND)

output_process = subprocess.Popen(cmdline,shell=True, stdout=subprocess.PIPE, env={'CLASSPATH':'/path/to/java/packages'})

答案 2 :(得分:0)

请注意,您必须转义字符串中的反斜杠(\)。您的示例很好,但是如果您的用户名实际上不是MyUsername但可能是“nerd”或任何其他形成有效转义序列的字符串,则命令将失败。 还要确保文件名中没有空格(或者使用其他示例中的拆分语法)。

所以你可能想要这样做:

output_process = subprocess.Popen(["javac", "-cp", 
    "C:\\Users\\MyUsername\\Desktop\\htmlcleaner-2.2.jar", "Scrapping_lastfm.java"],
    shell=True, stdout=subprocess.PIPE)