小能豆

通过 java-%1 在 cmd 中运行 python 文件不是有效的 Win32 应用程序

py

我正在尝试使用 java 执行 python 代码。我的代码:

public class PyTest {
    public static void main(String[] args) {
        Runtime.getRuntime().exec("python src\\gui.py");
    }
}

堆栈跟踪:线程“main”中的异常 java.io.IOException:无法运行程序“src\gui.py”:CreateProcess 错误 = 193,%1 不是有效的 Win32 应用程序

我知道,在 64 位机器上使用 32 位版本解释器执行 Python 代码时会出现此错误。但是,我的 64 位机器上只安装了 64 位版本的 Python。


阅读 23

收藏
2024-12-08

共1个答案

小能豆

你的问题表明 Java 的 Runtime.getRuntime().exec() 方法试图直接执行 src\gui.py 文件,而不是通过 Python 解释器来运行它。Windows 将尝试将 src\gui.py 文件本身当作可执行文件运行,这会导致错误 CreateProcess error=193, %1 is not a valid Win32 application,因为 .py 文件不是一个可执行文件。

要解决此问题,你需要明确指定使用 Python 解释器运行你的脚本。以下是修改后的代码:

import java.io.IOException;

public class PyTest {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("python src\\gui.py");
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

修复解释

  1. 明确调用 Python 解释器
  2. 使用 "python src\\gui.py" 指定 Python 解释器来运行脚本。
  3. 确保你的系统环境变量中包含了 Python 可执行文件的路径,否则需要使用完整路径,例如:"C:\\Path\\To\\Python\\python.exe src\\gui.py"

  4. 处理路径分隔符

  5. Java 的字符串需要用双反斜杠 \\ 表示文件路径。
  6. 也可以使用正斜杠 /,它在 Windows 和 Unix 系统上都能被正确解析:"python src/gui.py"

  7. 等待进程完成

  8. process.waitFor() 确保 Java 程序会等待 Python 脚本完成执行后再继续。

进一步优化:处理输出和错误流

如果脚本需要输出或调试信息,可以通过 Process 的输入输出流来捕获:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PyTest {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("python src\\gui.py");

            // 读取脚本的标准输出
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));

            // 读取脚本的错误输出
            BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));

            String line;
            System.out.println("Standard Output:");
            while ((line = stdInput.readLine()) != null) {
                System.out.println(line);
            }

            System.out.println("Error Output:");
            while ((line = stdError.readLine()) != null) {
                System.err.println(line);
            }

            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

常见问题排查

  1. 检查 Python 是否已安装
    在命令提示符中运行 python --versionpython3 --version,确保 Python 已安装并且路径正确。

  2. 检查脚本路径
    确保 src\gui.py 是正确的路径,并且文件存在。

  3. 权限问题
    确保你有权限执行该文件和访问 Python 解释器。

通过这些调整,应该可以成功从 Java 程序中运行 Python 脚本。

2024-12-08