2013-10-30 14 views
8

Tôi chỉ cần một gợi ý về cách thực hiện mọi việc đúng cách.subprocess.Popen: cách chuyển danh sách làm đối số

Giả sử tôi có một tập lệnh có tên script.py sử dụng danh sách tên làm đối số ["name1", "name2", v.v ...].

Tôi muốn gọi tập lệnh này từ tập lệnh khác bằng mô-đun phụ. Vì vậy, những gì tôi muốn làm là như sau:

myList = ["name1", "name2", "name3"] 
subprocess.Popen(["python", "script.py", myList]) 

Tất nhiên điều đó không hoạt động vì quy trình con. Phương pháp mở yêu cầu danh sách các chuỗi làm đối số. Vì vậy, tôi coi làm những điều sau đây:

subprocess.Popen(["python", "script.py", str(myList)]) 

Bây giờ quá trình bắt đầu nhưng nó không hoạt động bởi vì nó có một chuỗi như là đối số và không phải là một danh sách. Làm thế nào tôi nên sửa chữa đúng cách?

Trả lời

19

Ghép chúng bằng cách sử dụng toán tử +.

myList = ["name1", "name2", "name3"] 
subprocess.Popen(["python", "script.py"] + myList) 

BTW, nếu bạn muốn sử dụng chương trình python tương tự, thay "python" với sys.executable.

+0

hoặc '.extend()' nếu bạn không chắc chắn về loại đối số bổ sung. –

+0

@NiklasR hoặc '+ list (myList)' – falsetru

+1

'extend' chỉ hữu ích nếu bạn sửa đổi danh sách được đặt tên trước cuộc gọi. 'subprocess.Popen ([" python "," script.py "]. extend (myList))' sẽ chuyển 'None' (giá trị trả về' extend') làm đối số đầu tiên và duy nhất cho 'Popen()'. – chepner

1

Cảm ơn câu trả lời nhanh falsetru. Nó không hoạt động trực tiếp nhưng tôi hiểu cách làm. Bạn đang gợi ý tương đương với việc thực hiện:

subprocess.Popen(["Python","script.py","name1","name2","name3"]) 

Tôi có 3 đối số là chuỗi chứa trong danh sách gốc.

Tất cả tôi cần phải làm trong tập tin script.py của tôi là xây dựng một danh sách mới từ mỗi đối số nhận bằng cách làm như sau:

myList = sys.argv[1:] 

myList bây giờ là cùng so với cái tôi đã bước đầu!

["name1","name2","name3"] 

Không biết tại sao tôi không nghĩ về nó trước đó!

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