在apach中使用子进程时出现“找不到命令”错误

2024-06-17 11:38:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将我的django项目从开发服务器移动到生产服务器。我几乎把所有的事情都解决了,只有一个例外。当我在终端中运行以下代码(使用python manage.py shell)时,它可以正常工作,但是通过我的apache服务器(使用mod_gwsgi)运行它就不能正常运行了。在

我的代码:

    ...
    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时,我得到(例如):

^{pr2}$

所以没有错误。但是,当我运行我的apache服务器时,我得到:

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

我试着广泛地寻找这个问题的解决方案,但找不到任何能解决问题的方法——尽管我希望我遗漏了一些显而易见的东西,以便我能迅速解决这个问题。在

附加信息:

  • OS X雪豹

  • python版本是2.7.2

  • django 1.3

  • 路径包含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)

为了绝对指向函数。非常感谢。在


Tags: 代码服务器logtruestdoutshelloutprocess
1条回答
网友
1楼 · 发布于 2024-06-17 11:38:07

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

因此,不要只使用'blastn',使用'/some/path/blastn',将'/some/path/'替换为程序所在的完整路径。在

相关问题 更多 >