باستخدام os.execvp في بيثون
سؤال
ولدي سؤال حول استخدام os.execvp
في بيثون. لدي بعض الشيء التالي من التعليمات البرمجية التي يتم استخدامها لإنشاء قائمة من الحجج:
args = [ "java" , classpath , "-Djava.library.path=" + lib_path() , ea , "-Xmx1000m" , "-server" , "code_swarm" , params ]
عند إخراج I سلسلة باستخدام " ".join(args)
ولصق هذا في بلدي شل موجه، وJVM تطلق على ما يرام، ويعمل كل شيء. وتعمل كل شيء إذا كنت تستخدم os.system(" ".join(args))
في بلدي النصي بيثون، أيضا.
ولكن م> بت التعليمات البرمجية التالية لا تعمل:
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"، CLASSPATH، ...]
وطرق أخرى (نسخ ولصق والنظام) () العمل بسبب قذيفة انشقاقات سطر الأوامر في مسافات (إلا إذا هرب هم أو نقل). وفي الواقع مرت سطر الأوامر وصولا الى برنامج يسمى كصفيف (على عكس ويندوز)، وتتوقع JVM للعثور على عنصر مع "-classpath" فقط تليها عنصر آخر مع CLASSPATH.
ويمكنك ان ترى الفرق بنفسك عن طريق استدعاء السيناريو بيثون صغيرة التالية بدلا من JVM:
#!/usr/bin/python
import sys
print sys.argv
نصائح أخرى
تأكد من أنك لا تعتمد على التوسع قذيفة في CLASSPATH الخاص بك. مثلا "~ / my.jar" سوف تحصل على توسيع بواسطة قذيفة في مكالمة os.system، ولكن لا أعتقد في مكالمة os.execvp.