2009-04-14 32 views
5

Tôi có một con trăn kịch bản đơn giản như vậy:Đi qua một chuỗi đa dòng như một tham số để một kịch bản trong Windows

import sys 

lines = sys.argv[1] 

for line in lines.splitlines(): 
    print line 

tôi muốn gọi nó từ dòng lệnh (hoặc một tập tin .bat) nhưng đối số đầu tiên có thể (và có lẽ sẽ) là một chuỗi có nhiều dòng trong đó. Làm thế nào để làm điều này?

Tất nhiên, công trình này:

import sys 

lines = """This is a string 
It has multiple lines 
there are three total""" 

for line in lines.splitlines(): 
    print line 

Nhưng tôi cần để có thể xử lý một line-by-line tranh cãi.

EDIT: Đây có lẽ là một vấn đề dòng lệnh của Windows hơn là một vấn đề về Python.

CHỈNH SỬA 2: Cảm ơn tất cả các đề xuất tốt. Nó không giống như nó có thể. Tôi không thể sử dụng một trình bao khác vì tôi thực sự đang cố gắng gọi kịch bản từ một chương trình khác mà dường như sử dụng dòng lệnh Windows đằng sau hậu trường.

+0

Tôi không hiểu - hiện giờ bạn không làm việc gì? –

+0

Bạn nên chia nhỏ bằng "\ n" và xóa trước "\ r" để có khả năng tương thích nền tảng tốt hơn. Có 'bash' đặt carraige trả về trong các đối số của nó? (Không chắc). –

+0

Bạn không nên sử dụng mô-đun chuỗi nào cả. Dòng đó nên đọc 'lines = multiline.splitlines()' –

Trả lời

2

Chỉ cần gửi kèm theo đối số trong dấu ngoặc kép:

$ python args.py "This is a string 
> It has multiple lines 
> there are three total" 
This is a string 
It has multiple lines 
there are three total 
+0

Điều này có thể được thực hiện từ dòng lệnh của Windows không? –

+0

Rõ ràng là không .. – skrebbel

0

Không chắc chắn về các dòng lệnh Windows, nhưng sẽ công việc sau đây?

> python myscript.py "This is a string\nIt has multiple lines\there are three total" 

..or ..

> python myscript.py "This is a string\ 
It has [...]\ 
there are [...]" 

Nếu không, tôi sẽ đề nghị cài đặt Cygwin và sử dụng một vỏ lành mạnh!

+0

Không. Trước hết, cmd không sử dụng \ như ký tự thoát, thay vào đó nó sử dụng ^. Thứ hai,^n sẽ chỉ có chữ n, vì^chỉ có thể được sử dụng để thoát các ký tự đặc biệt nhưng không có khả năng tạo các ký tự đặc biệt, như \ n, \ r, v.v. – Joey

1

Sau đây có thể làm việc:

C:\> python something.py "This is a string^ 
More? 
More? It has multiple lines^ 
More? 
More? There are three total" 
+0

Điều này cho phép tôi mở rộng chuỗi của mình một cách hiệu quả nhiều dòng nhưng vẫn kết thúc mà không có ký tự "dòng mới" trong chuỗi. –

+1

Dòng trống là quan trọng trong trường hợp này. Ít nhất nó đã làm việc cho echo để đầu ra nhiều dòng nhưng tôi không thể kiểm tra ở đây nếu không vào lúc này. Nếu mọi thứ khác không thành công, hãy sử dụng giải pháp đường ống mà người khác đề xuất. Việc vượt qua nhiều dòng thông qua stdin là không có vấn đề, ít nhất. – Joey

0

Các bạn đã thử cài đặt bạn văn bản nhiều dòng như là một biến và sau đó đi qua việc mở rộng đó vào kịch bản của bạn. Ví dụ:

set Text="This is a string 
It has multiple lines 
there are three total" 
python args.py %Text% 

Ngoài ra, thay vì đọc một cuộc tranh cãi bạn có thể đọc từ tiêu chuẩn trong

import sys 

for line in iter(sys.stdin.readline, ''): 
    print line 

Trên Linux bạn sẽ ống văn bản nhiều dòng đầu vào tiêu chuẩn của args.py..

$ < lệnh-sản xuất-văn bản > | python args.py

+0

Dường như không hoạt động. Không trực tiếp từ cửa sổ dòng lệnh, và không phải từ một tập tin thực thi. – skrebbel

1

Đây là điều duy nhất mà làm việc cho tôi:

C:\> python a.py This" "is" "a" "string^ 
More? 
More? It" "has" "multiple" "lines^ 
More? 
More? There" "are" "three" "total 

Đối với tôi Johannes' solution gọi người phiên dịch python ở phần cuối của dòng đầu tiên, vì vậy tôi không có cơ hội để vượt qua dòng bổ sung.

Nhưng bạn nói bạn đang gọi tập lệnh python từ một tiến trình khác, không phải từ dòng lệnh. Vậy tại sao bạn không sử dụng dbr' solution? Điều này làm việc cho tôi dưới dạng tập lệnh Ruby:

puts `python a.py "This is a string\nIt has multiple lines\nThere are three total"` 

Và bạn đang viết chương trình nào gọi là tập lệnh python?Vấn đề bạn có là với luận qua, không phải với vỏ cửa sổ, không phải với Python ...

Cuối cùng, như mattkemp nói, tôi cũng khuyên bạn sử dụng đầu vào tiêu chuẩn để đọc luận nhiều dòng của bạn, tránh ma thuật dòng lệnh.

2

Tôi biết chủ đề này là khá cũ, nhưng tôi đã gặp nó trong khi cố gắng giải quyết một vấn đề tương tự, và những người khác có thể là tốt, vì vậy hãy để tôi chỉ cho bạn cách tôi giải quyết nó.

này hoạt động ít nhất là trên Windows XP Pro, với mã của Zack trong một tập tin gọi là
"C: \ Scratch \ test.py":

C:\Scratch>test.py "This is a string"^ 
More? 
More? "It has multiple lines"^ 
More? 
More? "There are three total" 
This is a string 
It has multiple lines 
There are three total 

C:\Scratch> 

Đây là dễ đọc hơn một chút so với giải pháp Romulo của trên .

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