Вопрос

У меня есть вопрос по поводу использования 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()?

Это было полезно?

Решение

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

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

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

#!/usr/bin/python
import sys
print sys.argv

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top