Jython subprocess.call() към Python

Опитвам се да използвам библиотека CPython от програма на Jython чрез subprocess.call() към скрипт на 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 е блокиран с помощта на PythonPath за Jython. Позволява ми да извикам „python --version“, но import os не успява да убие индекса ми.


person sarwar    schedule 29.02.2012    source източник


Отговори (2)


Проблемът беше, че PyDev/Jython предаваше JYTHONPATH като PYTHONPATH на подпроцеса.

Корекцията беше да се заредят всички променливи на средата, да се промени Python Path на правилното място за Python 2.7 и да се предаде на Popen чрез аргумента env.

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))

Блер наистина. Предотвратена аневризма! Гласува за този въпрос за подсказка.

person sarwar    schedule 29.02.2012

От вашия tracelog пътят, който сте конфигурирали, е грешен за Jython. Трябва да използвате os модула на Jython вместо този на Python2.7.

Python импортира всеки модул само веднъж, така че

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

определено би импортирал os модула от python2.7. Тогава

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

не може да намери правилния атрибут от os модула на Jython.

Моля, коригирайте пътя.

Или можете да използвате JyDT или нещо друго вместо това :)

person Felix Yan    schedule 29.02.2012
comment
Ааа! Бих включил dist-packages, за да мога да използвам pkg_resources, който не е включен в Jython. Не бях помислил, че може да презапише други пакети... да. Благодаря. - person sarwar; 29.02.2012
comment
Ем.. Не знам какво се случи тогава, съжалявам. - person Felix Yan; 29.02.2012
comment
Разбрах :) Благодаря отново. - person sarwar; 29.02.2012