2011-12-17 58 views
2

我想將我的django項目從開發服務器移到生產服務器。我用一個(BIG)例外解決了幾乎所有的問題。當我在終端中運行以下代碼(使用python manage.py shell)時,它工作正常,但是通過我的apache服務器(使用mod_wsgi)運行時運行不正常。'找不到命令'在apache中使用子進程時出錯'

我的代碼:

... 
    blastn_cline = NcbiblastnCommandline(query=filepath, db=db, evalue=0.1, outfmt=5, out=out, task="blastn-short", dust="no") 
    process = subprocess.Popen(str(blastn_cline),shell=True,stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
    proc_out, proc_err = process.communicate() 
    err_log = open('/Users/basehunt/logs/ncbi_error_log.log', 'a+') 
    err_log.write("\n"+str(datetime.datetime.now())+": "+str(proc_err)) 
    err_log.close() 
    ... 
當我在看我的日誌文件 ncbi_error_log.log我通過終端我得到運行後(作爲一個例子)

2011-12-17 12:30:54.771292: 

所以沒有錯誤。然而,當我通過我的Apache服務器上運行我得到:

2011-12-17 12:28:59.755323: /bin/sh: blastn: command not found 

我已經嘗試瞭解決這個問題的廣泛搜索,但無法找到任何東西,讓修復 - 儘管我希望我昭然若揭失去了一些東西很明顯,所以我可以很快地對此進行分類

附加信息:

  • OS X雪豹

  • Python版本2.7.2是

  • 的Django 1.3

  • PATH包含BLASTN目錄

如果您想要查看任何其他代碼,請告訴我。

解決:

通過改變

process = subprocess.Popen(str(blastn_cline),shell=True,stdout = subprocess.PIPE, stderr = subprocess.PIPE) 

process = subprocess.Popen('/Users/basehunt/BLAST/ncbi-blast-2.2.25+/bin/'+str(blastn_cline),shell=True,stdout = subprocess.PIPE, stderr = subprocess.PIPE) 

,以絕對的指向功能。非常感謝。

回答

4

在Apache/mod_wsgi下運行時,您必須使用完整路徑名稱來運行程序或任何正在訪問的文件。這是因爲您的用戶PATH不被Apache繼承或使用。進程的當前工作目錄也可以是任何東西,所以不能依賴於相對路徑。

因此,使用'/ some/path/blastn'替換'/ some/path /',而不是使用程序所在位置的完整路徑。

+0

嗨格雷厄姆,非常感謝。正如我在編輯中提到的那樣,我需要用''''而不是'/'來指定我的路徑。不知道這是爲什麼。另外,你對這個問題刪除的有關'/ bin/sh'搞亂的評論是如此的正確......這樣做真的和我的服務器搞砸了,我不得不做很多救援。另外,在modwsgi上做的很棒!再次感謝。 – rjralgar 2011-12-19 01:03:07

+0

你不應該需要雙斜槓,所以不知道那裏發生了什麼,除非你第一次更改代碼時沒有重新加載代碼。甚至無法想象爲什麼你會想到首先嚐試雙斜槓。關於源代碼重新加載的問題,可能是http://code.google。com/p/modwsgi/wiki/ReloadingSourceCode – 2011-12-19 01:37:56

+0

完全正確 - 我沒有正確地重新加載我的源代碼,完全愚蠢。沒想到我從一開始就沒有寫過斜線,但git告訴我我做過了(爲什麼我會這樣做,我不知道 - 認爲我的大腦已經從這個'/ bin/sh'問題中被炒掉了) 。無論如何,再次感謝。 – rjralgar 2011-12-19 01:45:52