0

我不是一个 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 文件夹中,然后从那里执行所有内容。

4

1 回答 1

2

你可以,但你需要使用 a并添加在参数python_library中产生的规则。java_binaryresources

于 2018-03-27T15:02:05.570 回答