Jython subprocess.call () для Python - PullRequest
       24

Jython subprocess.call () для Python

1 голос
/ 29 февраля 2012

Я пытаюсь использовать библиотеку 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', но импорт os не может уничтожить мой индекс.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Проблема заключалась в том, что PyDev / Jython передавал JYTHONPATH как PYTHONPATH подпроцессу.

Исправлено: загрузка всех переменных среды, изменение пути к Python в правильное место для 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))

Блерг действительно. Аневризма предотвращена! Upvotes to этот вопрос для подсказки.

1 голос
/ 29 февраля 2012

В вашем журнале трассировки путь, который вы настроили, неверен для 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 или что-то вместо этого:)

...