2017-11-11 256 views
1

我有一個任務,我必須每次運行一系列參數略有不同的仿真。我想編寫一個Python腳本來自動執行此操作,但我遇到了一個問題。Python:編寫命令行指令時的字符串格式化

爲了簡化描述,我基本上有從命令行調用的N模擬,每個模擬都有一組不同的參數,我希望腳本一個接一個地執行它們。想象一下,要運行模擬,我會將execute_simulation...寫入命令行,其中...代表給定模擬的參數。這是我的腳本看起來像:

from subprocess import call 

<code> 

for i in range(0, N): 
    call('execute_simulation_%s' % (parameters[i])) 

但是,我總是在調用腳本時收到錯誤消息。任何人都可以提出爲什麼這可能是這種情況?

+2

什麼是錯誤信息? ['call'](https://docs.python.org/2.7/library/subprocess.html#subprocess.call)需要一個參數列表,而不是一個字符串(除非你使用'shell = True',你應該避免)。 – 2017-11-11 18:11:23

+1

什麼錯誤消息? –

+0

準確的模擬文件是什麼?你的'parameters []'是否也包含文件擴展名? 'call('ca%s.exe'%'lc')'正在爲我工​​作(Win7)。 – bastelflp

回答

0

如果您包含錯誤消息,但我會盡力幫助您。

call功能將字符串的順序不是一個字符串(雖然Popen文檔指出它們轉換爲Windows上的字符串,因此它可能在特定的情況下工作)。

此外,在您給出的示例代碼中,您做了call('execute_simulation_%s' % (parameters[i]))。如果parameters[i]不是字符串,而是列表,元組,生成器或str將在該對象上調用,這意味着您得到類似execute_simulation ['arg0', 'arg1', 'arg2', 'arg3', 'arg4']的東西。這可能不是你想要的。您可以在序列上撥打' '.join以獲得類似execute_simulation arg0 arg1 arg2 arg3 arg4的內容。

這樣說的話,我認爲parameters列表包含每個調用的參數列表。然後,你可以只是做

args = [f'arg{i}' for i in range(5)] 
parameters = [args for i in range(5)] 

for args in parameters: 
    call(('execute_simulation', *args)) 

而且,考慮使用subprocess.run,因爲它建議在Python使用3.5+代碼(它的工作原理就像call)。 我希望這適用於你的情況。