2016-09-26 48 views
0

我試圖創建一個基本函數,該函數將call()subprocess模塊傳遞給程序的文件名和參數。文件名和參數是變量。當我使用call()時,它接受變量,但被調用程序讀取包含"的字符串。將變量用作Python 2.7.x中子進程調用的命令的參數

這裏是有問題的代碼:

from subprocess import call 

def mednafen(): 
    print "Loading "+romname+"..." 
     call(["mednafen", args, romname]) 
     print "Mednafen closed." 
romname="kirby.zip" 
args="-fs 1" 
mednafen() 

我預計這將執行

mednafen -fs 1 kirby.zip 

而是它似乎解釋變量的字符串作爲本:

mednafen "-fs 1" "kirby.zip" 

由於這個,mednafen無法運行,因爲它無法解析以開頭的參數。 如果我使用shell=True,它的工作方式與預期的一樣,但該功能顯然非常不鼓勵,因爲它很容易被利用?

call("mednafen "+ args +" "+romname+"; exit", shell=True) 

有沒有辦法做到這一點不使用shell=True格式?

+1

嘗試用str替換參數(args) – XZ6H

+0

謝謝,我給了它一個去,但它似乎沒有任何效果。 call()仍然用引號解釋變量。 –

+0

你的代碼實際上並沒有傳入參數,但我想我們可以猜出你的意思。 – tripleee

回答

1

EDIT:由Jonas Wielicki建議的解決方案是使通常會用空格殼語法來分離被列爲一個單獨的項目確定每一個串;那樣call()會正確讀取它們。 shlex是不必要的。

args = ["-fs", "1"] 
call(['mednafen']+args+[rom]) 

我的初始(以下簡明)溶液: shlex.split()取變量/串我餵它並將其轉換成字符串文字的列表,這又導致了稱爲命令正確解析它們,而不是將變量解釋爲引號內的字符串。 所以,而不是像"-fs 0"對待的論點,我得到-fs 0像我最初想要的。

import shlex 
call(shlex.split("mednafen "+args+" "+romname)) 
+0

在這種情況下,shlex.split可以工作,但如果您可以立即將自己的參數作爲正確的列表(''[「-fs」,「1」]''),那麼您應該這樣做,而不是使用shlex.split ,它有許多功能,可能會驚喜(處理報價等)。通過子進程,Python爲您提供了一個很好的工具,可以避免空格和引用的所有缺陷,只需將python字符串*正確*作爲一個參數。使用這種力量。 –

+0

這非常有幫助!非常感謝。這真的清除了subprocess如何處理程序/參數。 –

1

嗯,是的。這正是文檔所說的。創建並傳遞包含命令和所有參數的列表。

+0

的確,使'args'成爲一個列表,而'call(['mednafen'] + args + [romname])' – tripleee

+0

這給了我相同的結果。 'call()'用包含的引號解析'args'的內容。 –

+0

這是因爲你忘了把它變成一個列表而不是所有參數的字符串。 –

相關問題