我正在尝试将我的django项目从开发服务器移动到生产服务器。我用一个(BIG)例外解决了几乎所有事情。当我在终端中运行以下代码(使用python manage.py shell
)时,它工作正常,但是通过我的apache服务器运行(使用mod_wsgi)它运行不正常。
我的代码:
...
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 Snow Leopard
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)
以便完全指向该功能。非常感谢。
答案 0 :(得分:4)
在Apache / mod_wsgi下运行时,必须使用完整路径名来编程正在运行的程序,或者任何正在访问的文件。这是因为Apache不会继承或使用您的用户PATH。该进程的当前工作目录也可以是任何内容,因此也不能依赖于相对路径。
所以,不要只是'blastn',而是使用'/ some / path / blastn',将'/ some / path /'替换为程序所在位置的完整路径。