Ошибка «команда не найдена» при использовании подпроцесса в apache - PullRequest
2 голосов
/ 17 декабря 2011

Я пытаюсь переместить мой проект django с сервера разработки на рабочий сервер.Я сгладил почти все с одним (БОЛЬШИМ) исключением.Когда я запускаю следующий код в терминале (используя 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 Ответ

4 голосов
/ 18 декабря 2011

При работе в Apache / mod_wsgi вы ДОЛЖНЫ использовать полный путь к исполняемой программе или любым файлам, к которым у вас есть доступ.Это потому, что ваш пользовательский PATH не наследуется и не используется Apache.Текущий рабочий каталог процесса также может быть любым, поэтому он не может полагаться и на относительные пути.

Так что вместо 'blastn' используйте '/ some / path / blastn', заменяя '/some / path / 'с полным путем к месту расположения программы.

...