سؤال

ولدي سؤال حول استخدام 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top