2008-10-17 28 views
6

Tôi có câu hỏi về cách sử dụng os.execvp bằng Python. Tôi có chút mã sau đây được dùng để tạo ra một danh sách các đối số:Sử dụng os.execvp bằng Python

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

Khi tôi ra một chuỗi sử dụng " ".join(args) và dán vào dấu nhắc shell của tôi, JVM khởi động tốt, và mọi thứ hoạt động. Mọi thứ đều hoạt động nếu tôi sử dụng os.system(" ".join(args)) trong tập lệnh Python của tôi.

Nhưng bit mã sau đây không làm việc:

os.execvp("java", args)

tôi nhận được lỗi sau:

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

Vì vậy, những gì mang lại? Tại sao sao chép/dán vào vỏ hoặc sử dụng os.system() hoạt động, nhưng không phải os.execvp()?

Trả lời

11

Nếu biến "classpath" của bạn chứa ví dụ "-classpath foo.jar", nó sẽ không hoạt động, vì nó đang nghĩ tên tùy chọn là "-classpath foo.jar". Chia nó thành hai đối số: [..., "-classpath", classpath, ...].

Các cách khác (sao chép và dán và hệ thống()) hoạt động vì trình bao chia tách dòng lệnh tại dấu cách (trừ khi chúng được thoát ra hoặc được trích dẫn). Dòng lệnh trên thực tế được chuyển xuống chương trình được gọi là một mảng (không giống như trên Windows), và JVM đang mong tìm một phần tử chỉ với "-classpath" theo sau bởi một phần tử khác với classpath.

Bạn có thể thấy sự khác biệt cho chính mình bằng cách gọi script Python nhỏ sau đây thay vì JVM:

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

Bạn chỉ có thể sử dụng "print sys.argv", vì str (list()) == repr (danh sách()) –

+0

@John Millikin: Cảm ơn, tôi đã loại bỏ repr dư thừa(). – CesarB

0

Hãy chắc chắn rằng bạn không phải là dựa vào mở rộng vỏ trong classpath của bạn. Ví dụ. "~/my.jar" sẽ được mở rộng bởi vỏ trong một cuộc gọi os.system, nhưng không, tôi tin vào một cuộc gọi os.execvp.

Các vấn đề liên quan