Использование os.execvp в Python
Вопрос
У меня есть вопрос по поводу использования 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.