在apache中使用子进程时出现'command not found'错误

时间:2011-12-17 13:06:23

标签: python django apache subprocess mod-wsgi

我正在尝试将我的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)

以便完全指向该功能。非常感谢。

1 个答案:

答案 0 :(得分:4)

在Apache / mod_wsgi下运行时,必须使用完整路径名来编程正在运行的程序,或者任何正在访问的文件。这是因为Apache不会继承或使用您的用户PATH。该进程的当前工作目录也可以是任何内容,因此也不能依赖于相对路径。

所以,不要只是'blastn',而是使用'/ some / path / blastn',将'/ some / path /'替换为程序所在位置的完整路径。