无法从 java jar 运行 python 脚本

2023-12-02

在 IntelliJ 中工作时一切正常,但在我构建 jar 之后它就停止了。起初,只是我忘记将它放入 jar 构建配置中,但现在在确保它在那里之后,我仍然无法运行它。这些是我尝试的方法:

InputStream script = mainView.class.getResourceAsStream("vizualize3D.py");
Process process = new ProcessBuilder("python3", "-").start() ;

Process p1 = Runtime.getRuntime().exec("python3 " + script);

Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("python3 " + mainView.class.getResourceAsStream("vizualize3D.py"));

尽管有资源,但所有主题都不起作用。我还尝试在 IntelliJ 项目中指定它的路径,它可以工作,但只有在我从 jar 启动它后从 IntelliJ 运行时,它才不能工作。

编辑1: 对于那些不明白 py 文件位于 jar 文件中的人


没有任何选项涉及您尝试执行"python3 "+script,以及等效项,将会起作用。script is an InputStream,不是文件系统上的路径,因此只需将其与String不会给你任何有意义的东西。此外,由于您的脚本不在自己的文件中,并且 python 解释器没有简单的方法来提取它,因此简单地像这样调用它是行不通的。

但是,您可以做的是执行

python3 -

The -这里的选项(至少在类似 BSD 的系统上)意味着“从标准输入读取,并将其解释为脚本”。然后,在Java端,您可以将jar打包的资源作为流读取,并将其通过管道传输到python进程的标准输入。

有关为资源选择正确路径的详细信息,请参阅如何确定 JavaFX 应用程序所需的 FXML 文件、CSS 文件、图像和其他资源的正确路径?.

以下内容(其中脚本简单地放置在与类相同的包中)对我有用:

PythonRunner.java:

package example.python;

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

public class PythonRunner {

    public static void main(String[] args) throws Exception {

        String pythonInterpreter = "/usr/bin/python3" ; // default
        if (args.length > 0) {
            pythonInterpreter = args[0] ;
        }

        InputStream script = PythonRunner.class.getResourceAsStream("script.py");
        Process pythonProcess = new ProcessBuilder(pythonInterpreter, "-")
                .start();

        // This thread reads the output from the process and 
        // processes it (in this case just dumps it to standard out)
        new Thread(() ->  {
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(pythonProcess.getInputStream()))) {

                for (String line ; (line = reader.readLine()) != null ;) {
                    System.out.println(line);
                }
            } catch (IOException exc) {
                exc.printStackTrace();
            }
        }).start();

        // read the script from the resource, and pipe it to the
        // python process's standard input (which will be read because
        // of the '-' option)
        OutputStream stdin = pythonProcess.getOutputStream();
        byte[] buffer = new byte[1024];
        for (int read = 0 ; read >= 0 ; read = script.read(buffer)) {
            stdin.write(buffer, 0, read);
        }
        stdin.close();
    }

}

脚本.py:

import sys

for i in range(10):
    print("Spam")

sys.exit(0)

清单.MF

Manifest-Version: 1.0
Main-Class: example.python.PythonRunner

日食布局:

enter image description here

jar内容和运行结果:

$ jar tf runPython.jar 
META-INF/MANIFEST.MF
example/python/PythonRunner.class
example/python/script.py
$ java -jar runPython.jar 
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
Spam
$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从 java jar 运行 python 脚本 的相关文章

  • 如何使用 xlrd 将新列和行添加到 .xls 文件

    如何向 xlrd 中的工作表添加新列和 或行 我有一个使用 open workbook 读取的 xls 文件 我需要在第一张表中添加一个新列 bouncebacks 然后在该表中添加新行 但我在 xlrd 文档中找不到任何显示如何添加新行和
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • 如何在 JdbcTemplate 中创建 mySQL 存储过程

    背景 为了解决 MySql 中某些语句只允许在存储过程中出现的问题 我尝试在 JdbcTemplate 提交的 sql 中创建 运行然后删除存储过程 一个简单的例子是 这恰好是在 Spring Boot 中 Service public c
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 如何在 Pytorch 中将一维 IntTensor 转换为 int

    如何将一维 IntTensor 转换为整数 这 IntTensor int 给出错误 KeyError Variable containing 423 torch IntTensor of size 1 我所知道的最简单 最干净的方法 In
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • PyCharm - 如何挂起所有线程

    我们使用 PyCharm 5 0 1 进行多线程调试 当它在断点处停止时 只有特定线程停止 而所有其他线程继续 这使得 冻结时刻 和检查参数值以及其他线程的当前状态变得困难 当其中一个线程在断点处停止时 是否可以挂起所有线程 这在最新的 P
  • Java 不可变对象 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在学习不变性的概念 据我了解 一旦创建对象 不可变对象就无法更改其值 但我不明白不可变对象的以下用途 They are 自动是线程
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • 如何在 Sublime 2 REPL Mac 中运行 Python 3

    我的问题如下 我安装了 sublime 2 和 sublime repl 插件 一切正常 我唯一需要的是更改在控制台内置的 sublimerepl 上运行的 python 版本 我的意思是 我有 python 2 7 5 预先安装了 mav
  • Celery:每个工作人员的 task_acks_late 的不同设置/向 celery 添加自定义选项

    这个问题是后续问题django celery 禁用一个工作者的预取 有错误吗 https stackoverflow com questions 58290045 django celery disable prefetch for one
  • Python 队列 get()/task_done() 问题

    我的消费者端队列 m queue get queue task done
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • 在 REST Web 服务中接受逗号分隔值

    我正在尝试接收 REST URI 中以逗号分隔值形式的字符串列表 示例 http localhost 8080 com vogella jersey first rest todo test 1 abc test 其中 abc 和 test
  • 如何将 fields 参数传递到 Google Drive Python API 调用中

    I have results drive service files list body execute where body q query string maxResults 1 为了提高性能 我想限制返回的字段 如下所述 https
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使
  • Spring Transactional 减慢了整个过程

    我正在尝试分析我有两堂课的情况 其中一个类是 ProcessImpl 它是起点并在内部调用其他子事务 我不知道出了什么问题 processImpl正在导入一些东西并将相关数据写入数据库 Specs Spring orm版本 3 2 18 发
  • django admin 中内联模型的分页器

    我有这个简单的 django 模型 由一个传感器和特定传感器的值组成 每个日射强度计的值数量很多 gt 30k 是否可以以某种方式分页PyranometerValues在特定日期或一般情况下将分页器应用于管理内联视图 class Pyran

随机推荐

  • 在运行时修改程序集?

    我如何修改给定程序集中的内存加载方法 以便 clr 在实例化某些类的新对象时 它会使用修改后的代码创建新对象 您可以使用莫诺 塞西尔在加载之前修改程序集 您可以将修改后的程序集保存到字节数组中 然后调用Assembly Load加载字节数组
  • 在浏览器中显示 Excel 文件。 PHPExcel

    例如我正在使用这样的代码
  • 从另一个类访问变量 - Objective-C

    这个问题可能之前已经被问过 所以我很抱歉 我正在开发一个 iPhone 应用程序 假设我在 class1 中有一个变量 var 我想在 class2 中添加一个 UIButton 当点击它时 会将 var 重置为 0 当应用程序关闭时 会保
  • Apache Camel 中的集群:多个 JVM 相同的 CamelContext

    我有一个部署在集群上的应用程序 根据环境 集群可能有 2 或 4 个 JVM 该应用程序具有我们在所有 JVM 上部署的相同 CamelContext 因此 所有 JVM 都有相同的路由 对于 FTP 路由 这很好 因为它具有竞争力 并且只
  • C# 中的别名关键字(如 typedef)?

    我有 2 个库 在不同平台上有不同的大小写 似乎其他所有内容都是相同的 方法名称 参数顺序等 我如何创建一个别名 以便我当前的平台 a 拼写在编译时起作用对于平台 b 我真的不想为大小写差异制作一个包装器 您可以使用 using 关键字创建
  • C# 到 VB6 COM 事件(“对象或类不支持事件集”)

    真的是用这个把我的头发拉出来了 我有一个 C 项目 其接口定义为 Externally Accessible API InterfaceType ComInterfaceType InterfaceIsIDispatch public in
  • 如何在 WiX 中安装时填充组合框?

    编辑 我已经更新了下面的代码 现在它可以工作了 感谢罗布的回答 我找到了几页展示如何执行此操作 http www cmcrossroads com content view 13160 120 http www mail archive c
  • 带有国家点击和缩放功能的 d3 世界地图几乎无法正常工作

    我正在制作一张具有点击缩放功能的世界地图 当点击一个国家时 地图会放大 但该国家并不总是居中 当你点击并重复时 也会发生同样的情况 它似乎永远不会提供相同的结果 注意 如果禁用过渡功能 缩放和居中确实有效 只有在添加旋转时才会显示不正确 我
  • 隐藏用户表单后如何返回或重新显示它?

    我在 UserForm2 的一个命令按钮中包含以下代码 Private Sub CButton1 Click UserForm1 Show Me Hide End Sub Now Userform1显示 然后我在 Userform1 的一个
  • 如何打印使用 Apache Poi 和 java 制作的工作簿文件?

    我在 eclipse 中创建一页工作簿文件 需要打开打印对话框并打印这些文件 我了解如何打开打印对话框和所有内容 我只是找不到如何告诉系统它是我想要打印的工作簿文件 wb 因此 除非它知道我想用它打印什么 否则打开对话框是行不通的 有人至少
  • 未在此范围内声明的变量

    我正在为类制作一个程序 由于某种原因 当在类定义中声明它时 它给了我这个错误 错误 在函数中 void setMessageBuffer std string 错误 message 在这方面没有申明 class apple private
  • 是否可以在不使用 win32 API 库的情况下在 C# 中获取 LAN 中连接的 IP 地址列表?

    我正在尝试获取在 LAN 中连接的 IP 地址列表 是否可以在不使用 win32 API 库 Netapi32 dll 的情况下获得 有什么想法可以在不使用非托管 win32 动态库的情况下获得 Windows 7 操作系统的目标 您可以使
  • UIButton 与 UITableViewCellSelectionStyleGray 选择颜色

    我试图将 UIButton 的选定颜色设置为 UITableViewCellSelectionStyleGray 的颜色 问题是 UIButton 的选择颜色无法设置 只能设置图像 有谁知道如何使用 UITableViewCellSelec
  • 如何在 C# Windows 应用程序中的表单之间传递值?

    我有两个表单 A 和 B 表单 A 是应用程序的默认启动表单 我在 Form A 中做了一些事情 然后我想并行运行 Form B 然后通过 从表单 A 到表单 B 中的方法的参数 How Ian 给出了一些示例代码 但我想提出更广泛的观点
  • 使用 Excel 2016 将范围保存为图片

    该代码的目的是将一系列单元格保存为桌面上的图片 该文件已创建 但不包含任何单元格数据 它是具有范围相对大小的空白图像 该问题出现在 Office 2016 中 在 2013 中有效 Sub SendSnapshot2 Dim strRng
  • 将 CAGradient 遮罩层应用到 UITextView

    我有一个 UITextView 带有可滚动文本 我试图对其应用渐变层 因此可见文本的底部总是稍微淡出 这是我的代码 CAGradientLayer maskLayer CAGradientLayer layer maskLayer colo
  • 获取 EditText 中按下的键

    I want to know which key has been pressed in an EditText For example if a is pressed I want to get the value as a How ca
  • 在对象中按名称查找嵌套属性的最佳方法

    我有一个对象 dataLayer 它可以增加和减少长度 具体取决于您访问的页面数量 我想要 循环遍历目标并查找属性名称 ecommerce 我特别想找到 brandcode 的值 必须与 pagetitle Login Page 位于同一对
  • 如何使用 UIImage(contentsOfFile:String) 方法从 Images.xcassets 文件夹加载图像

    我知道之间的区别UIImage named String and UIImage contentsOfFile String 我刚刚保存了超过 200MB 的图像图片 xcassets文件夹 我发现我的应用程序内存使用量很大 超过 500
  • 无法从 java jar 运行 python 脚本

    在 IntelliJ 中工作时一切正常 但在我构建 jar 之后它就停止了 起初 只是我忘记将它放入 jar 构建配置中 但现在在确保它在那里之后 我仍然无法运行它 这些是我尝试的方法 InputStream script mainView