根据this的答案,我可以在Python中执行.bat
文件。不仅可以执行.bat
文件,还可以发送一个字符串作为参数,该字符串将在Java程序中使用?
我现在所拥有的:
Python脚本:
import subprocess
filepath="C:/path/to/batch/myBatch.bat"
p = subprocess.Popen(filepath, shell=True, stdout = subprocess.PIPE)
stdout, stderr = p.communicate()
print p.returncode # is 0 if success
Java程序:
public static void main(String[] args) {
System.out.println("Hello world");
}
我想拥有的东西:
Python脚本:
import subprocess
parameter = "C:\\path\\to\\some\\file.txt"
filepath="C:/path/to/batch/myBatch.bat"
p = subprocess.Popen(filepath, shell=True, stdout = subprocess.PIPE, parameter)
stdout, stderr = p.communicate()
print p.returncode # is 0 if success
Java程序:
public static void main(String[] args) {
System.out.println("Hello world");
System.out.println(args[1]); // prints 'C:\\path\\to\\some\\file.txt'
}
因此,主要思想是将python的字符串作为参数发送到Java程序,并使用它。我尝试过的是:
import os
import subprocess
filepath = "C:\\Path\\to\\file.bat"
p = subprocess.Popen(filepath, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
grep_stdout = p.communicate(input=b"os.path.abspath('.\\file.txt')")[0]
print(grep_stdout.decode())
print(p.returncode)
print(os.path.abspath(".\\file.txt"))
输出:
1
C:\\path\\to\\file.txt
1
表示出了点问题。就是这样,因为Java程序看起来像这样:
public static void main(String[] args) throws IOException {
String s = args[1];
// write 's' to a file, to see the result
FileOutputStream outputStream = new FileOutputStream("C:\\path\\to\\output.txt");
byte[] strToBytes = s.getBytes();
outputStream.write(strToBytes);
outputStream.close();
}
,并且在Python中执行file.bat
后,output.txt
为空。我究竟做错了什么?
答案 0 :(得分:1)
代码中的问题是您以错误的方式调用subprocess.Popen
。为了实现所需的功能,如documentation所述,Popen
应该使用包含分别包含“可执行文件”和所有其他参数的字符串列表进行调用。更准确地说,您的情况应该是:
p = subprocess.Popen([filepath, os.path.abspath('.\\file.txt')], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
作为旁注,仅/当“可执行文件”为输入(stdin)启动“请求”时,才应该/将使用.communicate(...)
。