繁体   English   中英

Jython subprocess.call()到Python

[英]Jython subprocess.call() to Python

我试图通过subprocess.call()到一个python脚本,从Jython程序中使用CPython库。

我可以毫无问题地通过Jython解释器进行调用。

[OpenJDK Server VM (Sun Microsystems Inc.)] on java1.6.0_22
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call('python /opt/fake.py', shell=True)              
ok!
0

但是当我在我的Jython程序中调用脚本时,它是在Eclipse / PyDev中构建的:

subprocess.call('python /opt/fake.py', shell=True)

结果如下:

    Traceback (most recent call last):
  File "/home/sarwar/jython2.5.2/Lib/site.py", line 62, in <module>
    import os
  File "/home/sarwar/jython2.5.2/Lib/os.py", line 50, in <module>
    import posixpath as path
  File "/home/sarwar/jython2.5.2/Lib/posixpath.py", line 216, in <module>
    if not os._native_posix:
AttributeError: 'module' object has no attribute '_native_posix'

有关如何使我的脚本在PyDev下运行与解释器的结果一致的任何建议?

提前致谢。

编辑1:我更正了我的模块导入只使用Jython库并且错误仍然存​​在。

编辑2:在做了一些更多的测试后,似乎CPython的衍生实例被使用Python的Jython卡住了。 允许我调用'python --version'但导入os失败杀死我的下标。

问题是PyDev / Jython将JYTHONPATH作为PYTHONPATH传递给子进程。

解决方法是加载所有环境变量,将Python Path更改为Python 2.7的正确位置,并通过env参数将其传递给Popen。

cmd = 'python /opt/fake.py'
my_env = os.environ
my_env["PYTHONPATH"] = '/usr/lib/python2.7/'
proc = subprocess.Popen(cmd ,bufsize=0, executable=None, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=None, close_fds=True, shell=True, env=my_env)
out = str(proc.communicate(proc.stdout))

Blergh确实。 动脉瘤避免了! 提出这个问题的提示。

从您的tracelog中,您配置的路径对于Jython来说是错误的。 你应该使用Jython的os模块而不是Python2.7。

Python只导入一次模块,所以

File "/usr/lib/python2.7/dist-packages/site.py", line 2, in __boot
    import sys, imp, os, os.path

肯定会从python2.7导入os模块。 然后

File "/home/sarwar/jython2.5.2/Lib/posixpath.py", line 216, in <module>
     if not os._native_posix:

无法从Jython的os模块中找到正确的属性。

请更正路径。

或者,您可以使用JyDT或其他东西:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM