2014-04-25 18 views
7

Tại sao tôi nhận được lỗi cú pháp cho mã python lót sau?Nếu câu lệnh và một dòng lệnh python từ dòng lệnh

python -c 'import re; if True: print "HELLO";' 
    File "<string>", line 1 
    import re; if True: print "HELLO"; 
       ^
SyntaxError: invalid syntax 

Đoạn mã dưới đây chỉ hoạt động tốt

python -c 'if True: print "HELLO";' 

Làm thế nào tôi có thể thay đổi một dòng của tôi để thực hiện kịch bản dự định của tôi trên một dòng duy nhất từ ​​dòng lệnh?

+1

Không phải là câu trả lời: Tại sao bạn muốn đặt nội dung vào một dòng? Lợi ích là gì, tại sao nó tốt hơn một kịch bản thực? – guettli

+0

Lợi ích là tôi không có bất kỳ quyền ghi tệp nào trên hệ thống mà tôi đang chạy tính năng này. Ngoài ra, tôi thường muốn sao chép và dán một lớp lót cho bạn bè, và điều này làm cho nó để họ không phải tạo tệp và cấp quyền thực thi. – AffluentOwl

+1

xem http://stackoverflow.com/questions/6167127/how-to-put-multiple-statements-in-one-line – Ashkan

Trả lời

6

Một tùy chọn để làm việc xung quanh hạn chế này là để xác định lệnh với định dạng $'string' sử dụng newline thoát chuỗi \n.

python -c $'import re\nif True: print "HELLO";' 

Lưu ý: điều này được hỗ trợ bởi vỏ như bash và zsh, nhưng không hợp lệ POSIX sh.

Như đã đề cập bởi @slaadvak, có một số cách giải quyết khác tại đây: Executing Python multi-line statements in the one-line command-line

4

Vấn đề không phải là với tuyên bố nhập cụ thể, mà vấn đề của bạn là bạn có bất kỳ điều gì trước khi có tuyên bố điều khiển luồng. Điều này sẽ không hoạt động:

[email protected]:~> python -c 'a = "1234" ; if True: print "hi"' 
    File "<string>", line 1 
    a = "1234" ; if True: print "hi" 
       ^
SyntaxError: invalid syntax 

Theo tham chiếu Python (https://docs.python.org/2/reference/compound_stmts.html), ';' chỉ có thể được sử dụng để kết hợp "các câu lệnh đơn giản" với nhau. Trong trường hợp này, bạn đang kết hợp câu lệnh đơn giản import re, với if True:. if True không phải là một tuyên bố đơn giản, bởi vì nó giới thiệu kiểm soát dòng chảy, và do đó là một tuyên bố hợp chất. Ít nhất đó là cách tôi giải thích tài liệu.

Dưới đây là toàn văn từ tài liệu tham khảo Python: 'khoản'

Câu lệnh ghép bao gồm một hoặc nhiều Một khoản bao gồm một header và một Tiêu đề khoản của một đặc biệt 'suite.' câu lệnh ghép là tất cả ở cùng một mức thụt đầu dòng. Mỗi mệnh đề tiêu đề bắt đầu bằng từ khóa nhận dạng duy nhất và kết thúc bằng một dấu hai chấm . Một bộ là một nhóm các câu lệnh được điều khiển bởi một mệnh đề. Một bộ có thể là một hoặc nhiều câu lệnh đơn giản dấu chấm phẩy trên cùng một dòng như tiêu đề, sau ruột của tiêu đề, hoặc nó có thể được một hoặc báo cáo thụt thêm về dòng tiếp theo

compound_stmt ::= if_stmt 
        | while_stmt 
        | for_stmt 
        | try_stmt 
        | with_stmt 
        | funcdef 
        | classdef 
        | decorated 
suite   ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT 
statement  ::= stmt_list NEWLINE | compound_stmt 
stmt_list  ::= simple_stmt (";" simple_stmt)* [";"] 
+1

Được bình chọn là câu trả lời này cung cấp "lý do" cho câu hỏi của tôi. Và Rynant cung cấp cách giải quyết. – AffluentOwl

1

Bạn có thể nhúng dòng mới trực tiếp trong đối số.

$ python -c 'import re 
> if True: 
> print "HELLO" 
> ' 
+0

Bạn làm như thế nào? Có một số kết hợp bàn phím đặc biệt không? Bởi vì chỉ cần nhấn enter thực hiện dòng mà không cần nhúng một dòng mới. – AffluentOwl

+2

Nếu bạn đang sử dụng bất kỳ vỏ tuân thủ POSIX nào, nhấn Enter ở giữa chuỗi được trích dẫn sẽ không thực hiện lệnh (trừ khi, ví dụ, bạn đã thay đổi ràng buộc 'readline' mặc định cho phím Enter). – chepner

+0

Tôi đang sử dụng Ubuntu. Có lẽ đó là một bash shell thay vì một shell tuân thủ POSIX? – AffluentOwl

1

Tại sao tôi lại nhận được một lỗi cú pháp cho mã python lót sau đây?

Python grammar có thể cấm small_stmt ';' compound_stmt. -c tranh luận có lẽ được hiểu như là file_input:

fileinput: (NEWLINE | stmt)* ENDMARKER 
stmt: simple_stmt | compound_stmt 
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE 
small_stmt: import_stmt <in this case> 
compound_stmt: if_stmt <in this case> 

Lưu ý: có một dòng mới vào cuối simple_stmt.if_stmt không phải là small_stmt không thể theo dõi một số small_stmt khác sau ';'. Một dòng mới là cần thiết để giới thiệu compound_stmt sau small_stmt.

Nó không phải là một vấn đề bởi vì bash phép lập luận multiline, chỉ không đóng dấu nháy đơn mở cho đến khi bạn thực hiện ví dụ .:

$ python -c ' 
> import re 
> if 1: 
> print(1) 
> ' 
1 

Lưu ý: > được in bằng vỏ bản thân ở đây. Nó không được nhập bằng tay.