参数中带有空格的 Python 子进程调用在 Windows 上不起作用

标签 python windows space

我正在运行一个 java 命令,该命令采用类路径和其他具有空白的文件位置。 Windows 似乎不喜欢它。

我的程序从 C:\Program Files\Splunk 运行,其中有一个空格

这是我的命令

c1 = os.path.join(appdir, "bin", "apache-flume-1.3.1-bin", "lib", "*")
c2 = os.path.join(appdir, "bin", "apache-flume-1.3.1-bin", "lib", "flume-ng-node-1.3.1.jar")
c3 = os.path.join(appdir, "bin", "dtFlume.jar")

classpath = c1 + os.pathsep + c2 + os.pathsep + c3
log4j = os.path.join(appdir,"bin", "apache-flume-1.3.1-bin", "conf", "log4j.properties")
flumeconf = os.path.join(appdir,"bin","flume-conf.properties");

变体 1 - 不起作用

cmdline = "java  -Xmx20m -Dlog4j.configuration=file:" + log4j + " -cp " + classpath + " org.apache.flume.node.Application -f " + flumeconf + " -n agent1"


try:
    p = subprocess.Popen("%s" %(cmdline),shell=True,stdout=subprocess.PIPE)

变体 2 - 不起作用

cmdline_1 = "java  -Xmx20m -Dlog4j.configuration=file:"
cmdline_2 = log4j 
cmdline_3 = " -cp " 
cmdline_4 = classpath
cmdline_5 = " org.apache.flume.node.Application -f " 
cmdline_6 = flumeconf
cmdline_7 = " -n agent1"


try:
    p = subprocess.Popen('""%s" "%s" "%s" "%s" "%s" "%s" "%s""' %(cmdline_1,cmdline_2,cmdline_3,cmdline_4,cmdline_5,cmdline_6,cmdline_7),shell=True,stdout=subprocess.PIPE)

变体 3 - 不起作用

cmdline_1 = "java  -Xmx20m -Dlog4j.configuration=file:"
cmdline_2 = log4j 
cmdline_3 = " -cp " 
cmdline_4 = classpath
cmdline_5 = " org.apache.flume.node.Application -f " 
cmdline_6 = flumeconf
cmdline_7 = " -n agent1"


try:
    p = subprocess.Popen("%s %s %s %s %s %s %s" %(cmdline_1,cmdline_2,cmdline_3,cmdline_4,cmdline_5,cmdline_6,cmdline_7),shell=True,stdout=subprocess.PIPE)

每次它给我相同/相似的错误,找不到主类,路径在 C:\Program 处被截断

"C:\Program Files\Splunk\etc\apps\APM_dynatrace\bin\runFlume.py""错误:无法找到或加载主类 Files\Splunk\etc\apps\APM_dynatrace\bin\apache-flume- 1.3.1-bin\conf\log4j.properties

最佳答案

不要使用 shell=TrueThe docs声明如果使用实际内置到 shell 中的命令,则在 Windows 上只需要 shell=True:

The only time you need to specify shell=True on Windows is when the command you wish to execute is built into the shell (e.g. dir or copy). You do not need shell=True to run a batch file or console-based executable.

如果您不使用 shell=True,您可以将参数作为列表传递,而不必担心 shell 会错误地处理空格。

p = subprocess.Popen(['java', '-Xmx20m', '-Dlog4j.configuration=file:%s' % log4j,
                      '-cp', classpath, 'org.apache.flume.node.Application', 
                      '-f', flumeconf, '-n', 'agent1'], stdout=subprocess.PIPE)

关于参数中带有空格的 Python 子进程调用在 Windows 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24681820/

相关文章:

javascript - 一个空间等于多少个像素?

python - python的pandas插件在canopy环境中不排序?

c - 在 windows 上写

windows - 检查所有驱动器(字母和自由大小)并比较高数字自由大小

html - 使用 flexbox 时如何垂直应用属性周围的空间?

java - 如何在带有单词和整数的字符串中的数字之间添加空格?

python - 如何在默认 Python 版本之间动态切换?

python - 模拟具有不同返回值的相同方法在Python中的函数中调用两次

python - noob,但是我在我的mac上安装了python 2.7.5,如何我 "target"那个而不是内置的2.7.2?

windows - 如何识别 Qt 应用程序/小部件何时跨显示器拖动