2013-10-27 41 views
1

我需要一些幫助從python內運行bash腳本。我有一個程序向python腳本發送參數(例如「$ 1」)。我想從python腳本中運行一個bash腳本,向它發送參數,然後在python腳本中接收並打印bash的結果(echo)。這是我有:發送參數並從python運行bash

#!/usr/bin/env python 

import subprocess 
process = subprocess.Popen('sorter.sh', stdout=subprocess.PIPE, shell=True) 
out, err = process.communicate() 
print(out) 

當我嘗試運行它,不過,我得到這個錯誤:當我改變對Arg的沒有發現

/bin/sh的:sorter.sh 'sh sorter.sh'我得到sh:無法打開'sorter.sh'

我知道肯定的bash腳本工作...當我從shell運行它並提供一個文件( sh sorter.sh /file/filed/files.jpg)這一切都完美無缺。誰能告訴我我做錯了什麼?謝謝!

+0

嘗試使用完整路徑或./sorter.sh – yemu

回答

0

根據錯誤信息,好像當前工作目錄中沒有sorter.sh。指定腳本的絕對路徑。

替換以下:

process = subprocess.Popen('sorter.sh', stdout=subprocess.PIPE, shell=True) 

有:

process = subprocess.Popen('sh /path/to/sorter.sh', stdout=subprocess.PIPE, shell=True) 

或:

process = subprocess.Popen(['sh', '/path/to/sorter.sh'], stdout=subprocess.PIPE) 
+0

或者將相關目錄添加到'PATH'環境變量。 – tripleee

+0

謝謝,那第一個做到了,杜。我以爲bash腳本與python腳本在同一個目錄就足夠了。顯然不是! – Artfail

0

要發送接收的bash腳本的Python腳本參數,你可以使用sys.argv

#!/usr/bin/env python 
import sys 
from subprocess import check_output as qx 

output = qx(["/path/to/sorter.sh"] + sys.argv[1:]) 
print output, 

如果調用python腳本作爲python-script a b c然後將其與abc參數調用sorter.sh

注意:該代碼期望sorter.sh具有適當shebang和執行權限(chmod +x /path/to/sorter.sh)。

+0

我試着運行你的腳本,並得到OSError:沒有這樣的文件或目錄(即使有更正的完整路徑到sorter.sh)。然後我嘗試將它與我原來的嘗試結合起來,例如:'import sys import subprocess print'Argument List:',str(sys.argv) process = subprocess.Popen([「sh/usr/local /sabnzbd/var/scripts/sorter.sh「] + sys.argv [1:],stdout = subprocess.PIPE,shell = True) out,err = process.communicate() print(out)現在,但參數仍然沒有被髮送。還有什麼想法?如果我試圖只發送一個參數給bash,會更容易嗎? – Artfail

+0

@Artfail:您應該按原樣複製代碼(除sorter.sh之外的路徑)。什麼是shebang('head -1 sorter.sh')? 'sorter.sh'的文件權限是什麼('ls -l sorter.sh')? – jfs

+0

代碼被直接複製(並修復了路徑)。文件權限是755('-rwxr-xr-x 1 root root'),並且我試過把shebang當作'#!/ bin/bash'和'#!/ bin/env bash';無論哪種方式,我得到以下內容: – Artfail