jEdit Python Shell 插件无法 运行 Python3(如何更新 .jar 存档中的文件?)
jEdit Python Shell plugin fails to run Python3 (How to update a file in a .jar archive?)
让我很疑惑的是,jEdit的PythonShell插件怎么不能和Python3一起使用呢?这个问题似乎自 2012 年以来就为人所知,显然还没有人提供该插件的更新版本 ( http://www.jedit.org/oldtrackers/Plugin%20Feature%20Requests/3498547.html ),适用于 Python2.x 和 Python3.x 。
只有我一个人需要在 jEdit 中将此插件设置为 运行 吗?
问题在于此插件使用了 Python3 中不可用的 execfile() 函数。为了提供修复,有必要替换此插件的 PythonShell.java 代码:
execfile("filename")
和
exec( open("filename").read() )
对于不太熟悉 Java 的我来说,很难从调整后的 PyhonShell.java 文件中获得更新的 PythonShell.jar。
解决问题成功后,我仍然不明白的是如何使用jar。经过许多不同的方法,我终于得出了:
jar -u PythonShell.jar -C python/shell PythonShell.class
但这也给了我和我一直得到的一样的东西:
jar: `-u' mode requires a file name
jar 的 -help 无法帮助我理解我在尝试用从编译的 [=36] 中获得的新版本替换 PythonShell.jar 中的 PythonShell.class 文件时做错了什么=] 文件。
我的解决方法是将 .jar 重命名为 .zip,使用文件管理器将 PythonShell.class 文件放入其中,然后将其重命名回 .jar,但我很乐意摆脱不理解 'jar' 命令如何工作的直觉不好。
默认情况下,jar
命令在流模式下工作。这意味着如果您执行 jar -c foo
,它会使用文件 foo
从中创建一个 JAR 并将其输出到标准输出。然后您可以将其重定向到一个文件 (jar -c foo >foo.jar
),或者您可以使用 -f
指示 jar
创建一个文件 (jar -cf foo.jar foo
).
这同样适用于更新 JAR 文件,您可以像 cat foo.jar | jar -u foo >foo2.jar
一样将输入和输出流式传输,或者您可以使用 -f
指示它就地更新文件,例如jar -uf foo.jar foo
.
如果您告诉它使用 -u
更新文件,但您没有指定要使用 -f
更新哪个文件并且没有在 stdin 上提供任何内容,那么它无法正常工作不知道要更新什么文件。
PS:欢迎您提交补丁到https://sourceforge.net/p/jedit/plugin-patches插件维护者接受,或者如果没有活跃的维护者而您想超越插件的维护。
直击我问题的核心,事实证明我的尝试和我的
之前直观的理解如何更新一个Java jar archive:
XXX jar -u PythonShell.jar -C python/shell PythonShell.class XXX
是一个纯粹的生活胡说八道的案例......这是我新获得的理解
应该怎么做:
jar -uf PythonShell.jar python/shell/PythonShell.class
为了能够以这种方式做到这一点,重新创建
正确的目录以形成文件所需的路径 PythonShell.class 。当前目录真正重要的命令案例。这仍然不是可能的情况,但至少我的直觉不好,我已经走到了死胡同
路径现在消失了。
这是我进行的练习,以测试我对
jar 命令有效:
让我们在目录 [foo]
中创建一个名为 'bar'
的文件,其中包含文本 "bar"
:
~ $ mkdir foo
~ $ echo bar > foo/bar
让我们将文件 'bar'
放入 jar 存档 'foo.jar'
目录 [foo]
文件 'bar'
存储在:
~ $ jar -c foo/bar > foo.jar
让我们看一下 "in",在 'foo.jar'
jar-archive 文件中:
~ $ cat foo.jar | jar -t
META-INF/
META-INF/MANIFEST.MF
foo/bar
让我们删除目录 [foo]
并提取 jar 存档以重新获取目录和其中的文件。然后看看文件内容是什么 'bar'
:
~ $ mv foo foo-old-1
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
bar
好的 - 到目前为止一切如预期?
现在准备更新文件 'bar'
中的必要内容
带有补丁 'bar'
文件的 jar-archive 现在包含文本 "foo"
:
~ $ echo foo > foo/bar
此处 CORRECT 语法用于更新存储在目录 [foo]
中的 jar 归档文件 'bar'
。对我来说,在这种情况下,文件路径 'bar'
的指定方式对发生的事情有很大影响,这让我感到惊讶:
~ $ jar -uf foo.jar foo/bar
让我们检查一下是否成功:
~ $ mv foo foo-old-2
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
foo
好的 - 这就是我所期望的。我自己认为这是一个好兆头,表明我现在做对了。
让我很疑惑的是,jEdit的PythonShell插件怎么不能和Python3一起使用呢?这个问题似乎自 2012 年以来就为人所知,显然还没有人提供该插件的更新版本 ( http://www.jedit.org/oldtrackers/Plugin%20Feature%20Requests/3498547.html ),适用于 Python2.x 和 Python3.x 。 只有我一个人需要在 jEdit 中将此插件设置为 运行 吗?
问题在于此插件使用了 Python3 中不可用的 execfile() 函数。为了提供修复,有必要替换此插件的 PythonShell.java 代码:
execfile("filename")
和
exec( open("filename").read() )
对于不太熟悉 Java 的我来说,很难从调整后的 PyhonShell.java 文件中获得更新的 PythonShell.jar。 解决问题成功后,我仍然不明白的是如何使用jar。经过许多不同的方法,我终于得出了:
jar -u PythonShell.jar -C python/shell PythonShell.class
但这也给了我和我一直得到的一样的东西:
jar: `-u' mode requires a file name
jar 的 -help 无法帮助我理解我在尝试用从编译的 [=36] 中获得的新版本替换 PythonShell.jar 中的 PythonShell.class 文件时做错了什么=] 文件。
我的解决方法是将 .jar 重命名为 .zip,使用文件管理器将 PythonShell.class 文件放入其中,然后将其重命名回 .jar,但我很乐意摆脱不理解 'jar' 命令如何工作的直觉不好。
默认情况下,jar
命令在流模式下工作。这意味着如果您执行 jar -c foo
,它会使用文件 foo
从中创建一个 JAR 并将其输出到标准输出。然后您可以将其重定向到一个文件 (jar -c foo >foo.jar
),或者您可以使用 -f
指示 jar
创建一个文件 (jar -cf foo.jar foo
).
这同样适用于更新 JAR 文件,您可以像 cat foo.jar | jar -u foo >foo2.jar
一样将输入和输出流式传输,或者您可以使用 -f
指示它就地更新文件,例如jar -uf foo.jar foo
.
如果您告诉它使用 -u
更新文件,但您没有指定要使用 -f
更新哪个文件并且没有在 stdin 上提供任何内容,那么它无法正常工作不知道要更新什么文件。
PS:欢迎您提交补丁到https://sourceforge.net/p/jedit/plugin-patches插件维护者接受,或者如果没有活跃的维护者而您想超越插件的维护。
直击我问题的核心,事实证明我的尝试和我的 之前直观的理解如何更新一个Java jar archive:
XXX jar -u PythonShell.jar -C python/shell PythonShell.class XXX
是一个纯粹的生活胡说八道的案例......这是我新获得的理解
应该怎么做:
jar -uf PythonShell.jar python/shell/PythonShell.class
为了能够以这种方式做到这一点,重新创建 正确的目录以形成文件所需的路径 PythonShell.class 。当前目录真正重要的命令案例。这仍然不是可能的情况,但至少我的直觉不好,我已经走到了死胡同 路径现在消失了。
这是我进行的练习,以测试我对 jar 命令有效:
让我们在目录 [foo]
中创建一个名为 'bar'
的文件,其中包含文本 "bar"
:
~ $ mkdir foo
~ $ echo bar > foo/bar
让我们将文件 'bar'
放入 jar 存档 'foo.jar'
目录 [foo]
文件 'bar'
存储在:
~ $ jar -c foo/bar > foo.jar
让我们看一下 "in",在 'foo.jar'
jar-archive 文件中:
~ $ cat foo.jar | jar -t
META-INF/
META-INF/MANIFEST.MF
foo/bar
让我们删除目录 [foo]
并提取 jar 存档以重新获取目录和其中的文件。然后看看文件内容是什么 'bar'
:
~ $ mv foo foo-old-1
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
bar
好的 - 到目前为止一切如预期?
现在准备更新文件 'bar'
中的必要内容
带有补丁 'bar'
文件的 jar-archive 现在包含文本 "foo"
:
~ $ echo foo > foo/bar
此处 CORRECT 语法用于更新存储在目录 [foo]
中的 jar 归档文件 'bar'
。对我来说,在这种情况下,文件路径 'bar'
的指定方式对发生的事情有很大影响,这让我感到惊讶:
~ $ jar -uf foo.jar foo/bar
让我们检查一下是否成功:
~ $ mv foo foo-old-2
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
foo
好的 - 这就是我所期望的。我自己认为这是一个好兆头,表明我现在做对了。