2014-10-18 98 views
1

我想從python運行shell命令,並獲取語法錯誤。這可能與嵌套引號有關,但我無法弄清楚如何使其工作。Python子進程給出語法錯誤,但從shell運行

下面是一個命令:

In [44]: command 
Out[44]: '/Applications/itt/idl/bin/idl -e "print, barycorr(2456718.886512, 16.109814, -36.799472, 0, obsname=\'CTIO\')"' 

In [45]: print command 
/Applications/itt/idl/bin/idl -e "print, barycorr(2456718.886512, 16.109814, -36.799472, 0, obsname='CTIO')" 

當我運行無論使用下面的兩個命令,我得到了IDL語法錯誤:

subprocess.call(command, shell=True) 
subprocess.call(shlex.split(command)) 

如果我運行命令(輸出)[45])從命令行,它完美的作品。任何想法我做錯了什麼?

謝謝!

+0

請發佈完整的錯誤追溯。 – 2014-10-18 10:24:11

回答

1

嘗試手動構建您的列表,如:

cmd_lst = ['/Applications/itt/idl/bin/idl', 
      '-e', 
      ("print, barycorr(2456718.886512, 16.109814, -36.799472, 0," 
      " obsname='CTIO')"), 
      ] 

subprocess.call(cmd_lst) 

我分裂的長字符串轉換成兩行。圓括號確保即使跨越多行,也將其作爲相同的字符串處理。作爲副作用,如果被調用的程序不需要,單引號的轉義可以被省略。

+1

這正是shlex正在做的事情,也是在shell = True的情況下運行意味着你不需要拆分命令 – 2014-10-18 10:32:28

+0

@PadraicCunningham:是的。但是由於額外的fork有所有的開銷(對於未經檢查的shell命令+ evtl。安全風險),我不會默認它。手動構建列表允許人們實際理解/瞭解場景背後發生的情況,而沒有額外的隱含層,我認爲這對解釋有用。 – 2014-10-18 10:53:43

+0

謝謝唐,那工作。我認爲分割長字符串是造成差異的原因,因爲我不需要避免引號。 – kgully 2014-10-19 01:15:20