Использование os.execvp в Python - PullRequest
       24

Использование os.execvp в Python

6 голосов
/ 17 октября 2008

У меня есть вопрос об использовании os.execvp в Python. У меня есть следующий фрагмент кода, который используется для создания списка аргументов:

args = [ "java"
       , classpath
       , "-Djava.library.path=" + lib_path()
       , ea
       , "-Xmx1000m"
       , "-server"
       , "code_swarm"
       , params
       ]

Когда я вывожу строку с помощью " ".join(args) и вставляю ее в приглашение оболочки, JVM запускается нормально, и все работает. Все работает, если я использую os.system(" ".join(args)) в своем скрипте Python.

Но следующий бит кода не работает:

os.execvp("java", args)

Я получаю следующую ошибку:

Unrecognized option: -classpath [and then the classpath I created, which looks okay]
Could not create the Java virtual machine.

Так что же дает? Почему копирование / вставка в оболочку или использование os.system() работает, но не os.execvp()?

Ответы [ 2 ]

11 голосов
/ 17 октября 2008

Если ваша переменная "classpath" содержит, например, "-classpath foo.jar", она не будет работать, так как думает, что имя опции - "-classpath foo.jar". Разделите его на два аргумента: [..., "-classpath", classpath, ...].

Другие способы (copy и paste и system ()) работают, потому что оболочка разделяет командную строку на пробелы (если они не экранированы или не заключены в кавычки). Командная строка фактически передается вызываемой программе в виде массива (в отличие от Windows), и JVM ожидает найти элемент с только «-classpath», за которым следует другой элемент с classpath.

Вы можете увидеть разницу сами, вызвав следующий маленький скрипт на Python вместо JVM:

#!/usr/bin/python
import sys
print sys.argv
0 голосов
/ 17 октября 2008

Убедитесь, что вы не полагаетесь на расширение оболочки в вашем classpath. Например. «~ / my.jar» будет расширен оболочкой в ​​системном вызове os.s, но я не верю в вызов os.execvp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...