2010-05-25 21 views
4

由於我是更多的ServerFault人,所以我第一次問了一些幫助。使用Python和subprocces.call執行腳本的問題尚未在Bash中起作用

我在Python中做了一些腳本,我一直熱愛這門語言,但是我有這個讓我的腳本無法工作的小問題。

這裏是有問題的代碼行:

subprocess.call('xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd',shell=True) 

我試圖與os.popen同樣的事情。所有變量都被正確設置。

當我在我的常規Linux shell中執行有問題的命令時,它工作得很好,但是當我使用我的Python腳本執行它時,我遇到了奇怪的錯誤。我甚至用print函數替換了subprocess.call(),以確保我使用了命令的確切輸出。

我去了解我的shell的環境變量,但他們幾乎是一樣的......我會發布我得到的錯誤,但我不確定它與我的問題有關。

使用在/usr/share/perl5/Config/IniFiles.pm線未初始化值$線[0]中取代(S ///)614 在模式匹配使用未初始化值$ _的( m //)在/usr/share/perl5/Config/IniFiles.pm 628行。

我不是Python專家,所以我很可能在這裏丟失了一些東西。

預先感謝您的幫助,

安東尼


編輯

繼miax的建議下,我停止使用shell =真。相反,我看了一下Python的文檔subprocess和使用下面的代碼:

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd' 
args = shlex.split(cmd) 
subprocess.call(args) 

可悲的是,它不會改變任何東西......


EDIT2

我已經使用了miax給出的提示,但是我仍然得到上面的錯誤...這是我使用的代碼。

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd'] 
subprocess.call(cmd) 

這真是奇怪......當我在常規shell中運行它確切的命令工作正常...

+0

有點奇怪,它會讓你在運行Python時遇到Perl錯誤。真的很愚蠢的問題:你確定你使用#!/ usr/bin/python而不是#!/ usr/bin/perl例如? – 2010-05-25 22:36:58

+0

xen-delete-image是一個Perl腳本。我的確在使用/ usr/bin/python。 – 2010-05-25 22:38:59

回答

0

xen-create-image腳本是否以hashbang開頭?也就是說,第一行有點像

#!/bin/sh 

?這是一件要檢查的事情。另一個原因是,你可以嘗試打電話給你的命令,如:

cmd = ['/bin/sh', '-c', 'xen-create-image --hostname %s --memory %s --partitions=/root/scripts/part.tmp --ip %s --netmask %s --gateway %s --passwd' % (nom, memory, ip, netmask, gateway)] 
subprocess.call(cmd, shell=False) 

你可能想打印cmd,以驗證這是您要運行的命令(即檢查取代)。

2

你(在大多數情況下)不想使用子與shell=True。 將它的參數列表傳遞給該命令。也就是說

  • 更安全:想象一下,一個用戶設法通過foo; rm -rf /; echo一些價值觀。
  • 更可靠:想象一下其中一個字符串包含$什麼的 - 它將被shell擴展並被該環境變量的內容所取代。

不知道你的代碼和xen-create-image,我認爲這是你的問題的原因。

PS:請務必查看命令的退出代碼是否爲零,如果不是,請適當採取措施。 (如果您確信它永遠是零,使用check_call,如果沒有這增加;這樣你至少有一個定義的行爲,如果它失敗)

+0

好的,那我該用什麼?因爲沒有提到shell = False或沒有導致錯誤... – 2010-05-25 22:32:42

+1

傳遞一個列表,例如'call(['xen-create-image','--hostname',nom,'--memory',memory, ')''''''')')')' (它導致錯誤,因爲它試圖運行一個命名爲* whole *的命令,當然不存在) – Marian 2010-05-25 22:35:04

0

在你EDIT2例子是失敗了,你認爲你給下列選項xen-create-image

  • --hostname
  • --memory
  • --partitions=...

...但你實際上是指定以下選項:

  • --hostname空間
  • 空間--memory空間
  • 空間--partitions=...

你有這樣一行:

cmd = ['xen-create-image', '--hostname ', nom, ' --memory ', memory, ' --partitions=/root/scripts/part.tmp', ' --ip ', ip, ' --netmask ', netmask, ' --gateway ', gateway, ' --passwd'] 

但是你要拿出多餘的空格:

cmd = ['xen-create-image', '--hostname', nom, '--memory', memory, '--partitions=/root/scripts/part.tmp', '--ip', ip, '--netmask', netmask, '--gateway', gateway, '--passwd'] 
+0

將我的edit2修改爲考慮到這一點... – 2010-05-25 23:05:59

+0

是的,但你現在得到什麼錯誤信息? – 2010-05-26 00:44:16

+0

然後在開始處我得到完全相同的錯誤消息。 – 2010-05-26 07:42:50

0

你需要print您所使用的命令:

cmd = 'xen-create-image --hostname '+nom+' --memory '+memory+' --partitions=/root/scripts/part.tmp --ip '+ip+' --netmask '+netmask+' --gateway '+gateway+' --passwd' 
print "COMMAND:", cmd 

然後將命令粘貼到您的shell中以確保它完全相同。

+0

我會給這個另一個嘗試:) Thx爲您的幫助! – 2010-05-26 07:43:17

+0

我試過這個,命令工作得很好! – 2010-05-26 10:55:54