2010-10-01 33 views
6

Khi sử dụng optparse tôi muốn nhận được toàn bộ chuỗi sau một tùy chọn, nhưng tôi chỉ nhận được một phần của nó lên đến không gian đầu tiên.Không gian và không gian Python trong một đối số

ví dụ .:

python myprog.py --executable python someOtherProg.py 

Những gì tôi nhận được trong 'thực thi' chỉ là 'trăn'.

Có thể phân tích các dòng đó bằng cách sử dụng optparse hoặc bạn có phải sử dụng argparse để làm điều đó không?

€:. Tôi đã cố gắng bao quanh nó trong "s Nhưng sau khi đào sâu hơn vào đoạn code tôi phát hiện ra rằng gọi subprocess không thể xử lý đối số

Chuỗi với dòng lệnh được nhồi nhét vào một. danh sách 'args'.

args = [self.getExecutable()] + self.getArgs().split() 

Nó giống như

"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]" 

Điều đó mang lại cho tôi những hệ thống không thể tìm thấy tập tin ngoại lệ. Khi tôi sử dụng

args[0] 

hoạt động. Nhưng tôi mất các đối số để thực thi.

Mô-đun xử lý con xây dựng một cmdline từ danh sách nếu nó không nhận được chuỗi ở địa điểm đầu tiên, vì vậy tôi không thể giải thích hành vi đó vào lúc này.

Trả lời

12

Bạn có thể đính kèm chúng trong dấu ngoặc kép để làm cho chúng hoạt động với mã hiện có.

python myprog.py --executable "python someOtherProg.py" 

Có thể phân tích ngành, nghề đó sử dụng optparse hoặc làm bạn phải sử dụng argparse để làm điều đó?

Tôi không biết liệu/bạn có thể làm như thế nào với optparse vì tôi chưa thực sự làm việc với optparse.

Tuy nhiên, tôi có thể giúp bạn với argparse. Dưới đây là một ví dụ nhanh:

#!/usr/bin/python 
import argparse, sys 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.') 
    parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables') 
    args = parser.parse_args(sys.argv[1:]) 
    print args.executable 

Và sử dụng:

[email protected]:~$ python myprog.py --executable python someOtherProg.py 
['python', 'someOtherProg.py'] 

tôi cũng khuyên bạn nên chuyển sang optparse-argparse. Optparsedeprecated từ 2.7.

4

Hành vi bạn thấy xuất phát từ thực tế là đó là trình bao của bạn, không phải python, phân tích cú pháp dòng lệnh và tách nó thành các từ của sys.argv. Python được đưa ra bởi shell thông qua exec() với argv đã được phổ biến.

Hầu hết các vỏ sẽ phân chia các mục argv tại dấu cách trừ khi bạn yêu cầu chúng không bằng cách trích dẫn hoặc thoát.

Báo giá hoạt động như được mô tả ở trên.

Trong nhiều vỏ bạn có thể làm điều này:

python myprog.py --executable python\ someOtherProg.py 

Các dấu chéo ngược thoát không gian sau mà không cần dấu ngoặc kép.

+0

Chuẩn bị để được ngạc nhiên: dưới Python 3.5, một không gian thoát được unescaped bởi sys.argv! Trong C, chúng ta có 'python ngớ ngẩn': 'argv [1]' = '" python "', 'argv [2]' = '" một số "'. "ngớ ngẩn" python một số "': 'argv [1]' = '" python một số "'. Và 'ngớ ngẩn python \ some':' argv [1] '=' "python một số" '. Nhưng với Python 3.5 chúng ta có 'silly.py python some':' argv [1] '=' "python" ',' argv [2] '=' "một số" '. 'silly.py" python một số "': 'argv [1]' = '" python một số "'. Và 'silly.py python \ some':' argv [1] '=' "python \\" ',' "một số" '. Kinh ngạc! – Urhixidur

4

Nếu bạn biết có bao nhiêu từ sau khi lá cờ đối số bạn sẽ nhận được, bạn có thể thay đổi cách bạn tạo ra các tùy chọn --executable ở trong optparse để xử lý đúng đắn tình hình:

Thay vì tham gia một đơn từ sau khi lựa chọn cờ bạn có thể đặt optparse phân tích cú pháp để tìm kiếm hai (hoặc nhiều) từ:

from optparse import OptionParser 
parser = OptionParser() 

parser.add_option("-f", "--file", action="store", dest="filename", 
         help="File to be processed.", metavar="FILE") 
parser.add_option("-e", "--executable", action="store", dest="my_exe", 
         help="Command to be executed", metavar="EXE", 
         nargs=2) 

Trong đoạn này, -f hoặc --file tùy chọn chỉ mong đợi một từ duy nhất và lưu trữ nó dưới dạng một chuỗi (mặc định) trong biến số filename.

Ngược lại, tùy chọn -e, --executable có hai từ vì tùy chọn nargs=2. Điều này sẽ dẫn đến hai từ được tìm thấy phía sau cờ -e hoặc --executable để được lưu trữ dưới dạng chuỗi trong danh sách Python my_exe.

Kiểm tra: http://docs.python.org/library/optparse.html để biết thêm thông tin về số optparse và ghi nhớ rằng nó đã không còn được dùng đến 2.7 có lợi cho argparse.

1

Chỉ cần hoàn thành danh sách câu trả lời này nếu bạn không thể nâng cấp lên argparse.

Optparse không thể xử lý các trường hợp này (nhiều chuỗi). Bạn chỉ có thể sử dụng nargs để chỉ định số lượng valia cụ thể, nhưng không có gì giống như "một hoặc nhiều". Bạn cần phải hack hoặc sử dụng thư viện khác nhau (ví dụ: argparse hoặc khác).

+0

bạn có thể cho tôi biết làm thế nào nó có thể được xử lý bằng cách sử dụng argparse? w/o sử dụng 'sys.argv' Tôi đoán argparse cũng không có tính năng như' parse_string' thay vì 'parse_args', ví dụ: để phân tích chuỗi có dấu cách như '" một hoặc nhiều "' – shahjapan

+0

argparse cũng bị hạn chế, tôi không có nhiều kinh nghiệm với nó :-( – lzap

+0

xem giải pháp khác do tôi cung cấp, nên làm việc với 'argparse' cũng như' optparse 'độc lập bằng cách sử dụng' shlex' lib. – shahjapan

6

Tôi đã tìm thấy một lựa chọn tốt khác shlex - Lớp phân tích từ vựng cho các cú pháp giống như trình đơn giản. liên kết

Nguồn: How to parse a command line with regular expressions?

>>> import shlex 
>>> shlex.split('"param 1" param2 "param 3"') 
['param 1', 'param2', 'param 3'] 
>>> shlex.split('"param 1" param2 "param 3"') 
Traceback (most recent call last): 
    [...] 
ValueError: No closing quotation 
>>> shlex.split('"param 1" param2 "param 3\\""') 
['param 1', 'param2', 'param 3"'] 
Các vấn đề liên quan