我不是一个 Python 开发人员,所以如果这个问题没有多大意义,我很抱歉。
我目前正在一个项目中工作,该项目包含一个 py 脚本,该脚本与用 Java 编写的服务器进行通信。脚本的相当一部分专门用于根据正在执行脚本的当前工作目录 (cwd) 查找服务器 jar 所在的位置。我虽然可以将脚本和服务器 jar 打包成某种 zip,我可以以独立的方式分发和执行,从而删除从脚本中获取 jar 的整个逻辑。有可能吗?
我一直在尝试为此目的使用BUCK python_binary,但是,我似乎无法将 jar 添加为 pex 的依赖项。
编辑 1
根据@sdwilsh 的建议,我能够使用 BUCK 创建一个包含 jar 的 pex,但是,每当我尝试从主 python 脚本访问它时,它都会失败,因为找不到 jar:
降压文件
java_library(
name = 'src_main',
srcs = glob(['src/main/java/**/*.java']),
source = '8',
target = '8',
visibility = [
'PUBLIC',
],
)
java_binary(
name = 'sample_jar',
main_class = 'br.com.samples.jar.Main',
deps = [':src_main'],
visibility = [
'PUBLIC',
],
)
python_library (
name = 'jarlib',
resources = [':sample_jar'],
)
python_binary(
name = 'wrapper',
main = 'wrapper.py',
deps = [':jarlib'],
)
PEX 内容
-rw-r--r-- 1 staff 1319 Mar 28 13:07 sample_jar
-rw-r--r-- 1 staff 259 Mar 28 13:15 wrapper.py
-rw-r--r-- 1 staff 308 Mar 28 13:15 wrapper.pyc
-rw-r--r-- 1 staff 917 Mar 28 13:15 __main__.pyc
-rw-r--r-- 1 staff 737 Mar 28 13:15 __main__.py
-rw-r--r-- 1 staff 242 Mar 28 13:15 PEX-INFO
包装器.py
import sys, subprocess
process = subprocess.Popen(['java', '-jar', 'sample_jar'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate()
输出为wrapper.py
('', 'Error: Unable to access jarfile sample_jar\n')
编辑 2
因此,我们似乎无法从 PEX 环境中引用 jar 文件。一种解决方法是将 pex 资源解压缩到 tmp 文件夹中,然后从那里执行所有内容。