2013-02-06 176 views
1

實施例 - 任何bash的關鍵字(例如elsein)也將導致此:如何轉義與python關鍵字匹配的bash關鍵字?

$ python -c 'import sys;for p in sys.path:print p' 
    File "<string>", line 1 
    import sys;for p in sys.path:print p 
       ^
SyntaxError: invalid syntax 

雙引號不能解決問題。

+1

導致什麼?什麼是錯誤? –

+0

我相信你有一個語法錯誤;你省略了其餘的錯誤:'SyntaxError:invalid syntax' – Anew

+0

正確,我又添加了它。 –

回答

6

這與for是Bash關鍵字這一事實無關。這只是,

import sys;for p in sys.path:print p 

是無效的Python語法。如果您運行python而沒有參數,然後在提示中鍵入該錯誤,則會得到相同的錯誤。

import sys 
for p in sys.path:print p 

您可以通過寫:這在你的bash命令做:

python -c ' import sys 
      for p in sys.path:print p 
      ' 

或本:

python -c $'import sys\nfor p in sys.path:print p' 

您可以通過添加一個換行符修復(其中$'...'是允許在字符串中使用類似C的轉義序列的Bash語法,如\n換行)。

+0

你確定嗎?對於循環工作正常('$ python -c'爲範圍(5)中的i:print i''),並且分號連接在導入後正常工作(sys中的'$ python -c'import sys; print「/ home」)。路徑')...我的語法不正確的是什麼? –

+1

Python似乎不喜歡分號後的任何複合語句('for',''while','def'等)。例如,'x = 1;而False:pass會導致語法錯誤。 –

+1

請參閱[語法](http://docs.python.org/2/reference/grammar.html)。如果我閱讀正確,只能用分號連接'small_stmt',並且包含'(expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | exec_stmt | assert_stmt]',但不包括'compound_stmt's ('if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef |裝飾')。它看起來像是什麼東西;其他的東西:第三個東西'被排除了,因爲「別的東西」並不簡單。 – DSM

1

請嘗試以下

python -c "exec(\"import sys;\\nfor p in sys.path:print p\")" 
+0

exec語句支持Python代碼的動態執行。第一個參數(如果是字符串)被解析爲一組Python語句,然後執行它(除非發生語法錯誤)。 – Guddu

+0

這確實有用。我真的需要做這一切嗎?我希望能夠在某些事情上拋出一些查詢循環,但是這種語法總是很難處理。 –

+0

同意...讓我爲你制定一種替代方法。 – Guddu

1

這裏是一個更辦法....位更直接

python -c "import sys; print '\n'.join(sys.path)" 
+0

連接返回一個字符串,它是可迭代的字符串(本例中是sys.path)的串聯。元素之間的分隔符是提供此方法的字符串,在本例中爲換行符。 – Guddu

0

它的工作原理,如果分號和compound_stmt關鍵字不相鄰:

# instead of '; for' 
python -c 'import sys; print [p for p in sys.path]' 

# instead of '; if' 
python -c "x=1; print x if x>0 else ''"