我正在尝试使用 ProcessBuilder 在我的 Java 程序中执行 python 文件,但是在使用 ProcessBuilder 时出现错误 13:权限被拒绝。
try{
ProcessBuilder pb = new ProcessBuilder(".");
pb.command(System. getProperty("user.dir"), "python3 scraper.py");
System.out.println("cd = "+pb.directory());
Process process = pb.start();
}catch (Exception e){
e.printStackTrace();
}
结果输出:
cd = null
java.io.IOException: Cannot run program "/Users/user_name/IdeaProjects/project_name": error=13, Permission denied
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073)
at Main.main(Main.java:896)
Caused by: java.io.IOException: error=13, Permission denied
at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:314)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)
... 2 more
我试过手动更改我的项目权限(我在 macOs 上)。不确定我需要做什么来解决这个问题。我相信错误不是运行 python 代码,而是实际运行 shell 命令本身。在必要的目录中手动执行 python 代码时,它运行良好,只有一次我尝试在我的 Java 代码中使用 ProcessBuilder。因此,如果我将“python3 scraper.py”更改为“ls”或“echo hello”或其他任何内容,则会发生完全相同的事情
MacOS 因权限不足而阻止 Java 程序执行 python 文件。要解决此问题,您可能需要授予 python 文件的可执行权限。你还需要用这样的东西来创建过程
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "python3 --version");
并验证 python 版本是否已打印
添加权限到你的脚本在 python 脚本上运行这个
chmod +x scraper.py
通过运行以下命令验证文件现在是否具有可执行权限:
ls -l scraper.py
输出应该在第一列显示
"-rwxr-xr-x"
,表示拥有者、组和其他人有可执行权限。