2013-05-29 173 views
1

我是python的新手。我搜索並嘗試以下方法:Python:將命令行參數分享給os.system調用

我有第三方應用程序稱爲「xyz」,它採用n參數。

我想將這個「xyz」轉換成我需要m個參數的模塊「abc.py」。

我想閱讀,並保持MY M參數,並通過剩餘的N參數來「XYZ」

注:n參數的數量是巨大的,所以它最好的,如果我們不需要重新狀態相同數量的參數在我的模塊,並直接傳遞給「xyz」

希望它應該是可能的,我沒有困惑。

感謝您的幫助。

+0

請注意,你應該避免'os.system',*特別是利用用戶提供的數據處理時,*。 'os.system'生成一個子shell,這意味着惡意參數可能會執行任意代碼。改用'subprocess.call'。 – Bakuriu

+0

可能的重複[在Python中調用外部命令](http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) – Wolf

回答

0

Python將接收sys.argv數組中的命令行參數。這只是在命令行上傳遞的值數組。

如果你想在Python中使用一些參數,只需從sys.argv中移除它們,然後將其餘的傳遞給os.system。

import sys 

args = [] 
for arg in sys.argv: 
    if isPythonArg(arg): 
    savePythonArg(arg) 
    else: 
    args.append(arg) 

os.system("xyz" + " ".join(args)) 
+0

如果有人輸入:$ python abc.py - - 一些python - 參數; rm -fr TheRootDirectory'? – Bakuriu

+0

我不會建議這是一件明智的事情。僅僅回答我的答案,我想原始的海報問。 – Chris

+0

問題不在於用戶愚蠢地添加這些參數,而是它可能*添加參數並執行任意代碼的事實。黑客可以使用這個漏洞並插入用戶不想添加的參數(這不是理論上的,即使通常在優秀的程序中沒有這樣巨大的缺陷)。 – Bakuriu

2

假設你的外部程序「xyz」是echo

import subprocess 
import sys 

m = 3 # number of args for abc.py; remainder goes to external program 'echo' 
args = sys.argv 
abc_args = args[1:m+1] 
echo_args = args[m+1:] 

cmd = ['echo'] 
cmd.extend(echo_args) 
subprocess.call(cmd) 

這導致

$ python abc.py 1 2 3 4 5 6 
4 5 6