我尝试使用ProcessBuilder从Java运行Python脚本。该脚本至少需要Python 3。我这样称呼它:
// the -u is for unbuffered output
String[] pythonCommand = {"python", "-u", "script.py"};
ProcessBuilder ps = new ProcessBuilder(pythonCommand);
Process pr = pb.start();
它在Windows上完全正常,当我定义script.py打印出带有sys.version_info
的Python版本时,它告诉我我正在运行Python 3.6.2
但是,在我朋友的Macbook上,脚本不起作用,sys.version_info
显示Python 2.7.1。她使用带有brew install python3
的自制软件安装了Python 3。当她从终端运行python3 scriptname.py
时,它在Python 3.6.2上运行,但python scriptname.py
在终端上运行在Python 2.7.1上。
因此,我认为我可以将Java ProcessBuilder命令更改为
String[] pythonCommand = {"python3", "-u", "script.py"}; // python3
如果操作系统名称不是从Windows开始,但该命令在Mac OS上不能使用Java的流程构建器 - 它会抛出
java.io.IOException: Cannot run program "python3": error=2, No such file or directory
我认为这是ProcessBuilder用于运行Python的路径的问题,这听起来不错吗?也许我需要尝试使用virtualenv在Mac上运行Python 3,但我不知道该怎么做。或者,它可能是完全不同的东西吗?
答案 0 :(得分:0)
Homebrew并不总是将实际的python3可执行文件链接到PATH
中的目录。您应该通过终端进行检查。
在我的MacBook上,python3链接在/usr/local/bin/python3
xvolks@localhost ~> ls -l /usr/local/bin/python3
lrwxr-xr-x 1 xvolks admin 35 19 aoû 00:02 /usr/local/bin/python3 -> ../Cellar/python3/3.6.2/bin/python3
如果缺少链接,您可以使用命令brew link python3
创造它。
答案 1 :(得分:0)
由于它依赖于Python并且在用户的计算机上安装了所有必需的模块,所以我最终完全不再采用这种方法。相反,我使用Pyinstaller将Python脚本打包成可执行文件,将它们放入Java资源文件夹,并从Java ProcessBuilder调用已编译的可执行文件。