我试图通过subprocess.call()将一个来自Jython程序的CPython库用于python脚本。
我可以毫无问题地通过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失败杀死我的下标。
答案 0 :(得分:3)
问题是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。动脉瘤避免了!赞成this question提示。
答案 1 :(得分:1)
从您的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或其他东西:)