У меня есть сценарий python 3.5, работающий под Windows, который вызывает определенную проблему (tblastn из BLAST + suite, если быть точным) в нескольких файлах. В большинстве этих файлов он работает нормально, но на некоторых он не работает с кодом возврата 0xC0000005. Если я возьму тот же самый вызов командной строки и запустил его из консоли в том же текущем рабочем каталоге, он выполняет отлично.Внешняя команда не работает с кодом возврата 0xC0000005 при вызове с Python, но работает в консоли
Я в настоящее время работает команда с subprocess.Popen
, как это:
childProcess = subprocess.Popen(blast_cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
universal_newlines=True,shell=True)
и затем вызвать subprocess.poll()
, пока она не завершится. Я использую многопоточность, запуская четыре процесса одновременно, но это все равно, если я заставляю его запускать по одному. То же самое происходит с os.system
, subprocess.run()
, subprocess.call()
и subprocess.check_call()
, и случается, установил ли я shell
на True
или False
.
Какой файл (ы) он терпит неудачу, является каждый раз, когда я запускаю код, но тот же файл будет работать, если он будет помещен в другой список файлов для обработки. Изменение метода вызова иногда приводит к сбою файлов, поэтому использование os.system
может привести к сбою разных файлов по сравнению с subprocess.Popen
. Таким образом, это не похоже на то, к какому файлу я вызываю tblastn.
Кто-нибудь знает, что может вызвать такое поведение?
Или, если кто-то знает, что может быть отличным между запуском в созданном процессе (в документации говорится, что он использует CreateProcess()
) по сравнению с запуском из командной строки, то, по крайней мере, мне нужно было где-то начать?
У меня есть идея о том, как его отладить, но я не знаком с tblastn; вы скомпилируете его из источника или имеете возможность? –
Я получил его как .exe; Я мог достать источник и перекомпилировать его, но я бы предпочел не делать этого. –
Хорошо - я так понимаю, ты на окнах?Не знаю о Windows, но в Linux вы можете добавить «valgrind» в список «blast_cmd» и предоставить ему файл журнала для вывода (его valgrind arg). Это приведет к записи stacktrace о том, где не удалось (хотя это поможет, если скомпилировано в debugmode, если это segfault). Это не значит, что вы можете отлаживать программу, но чтобы увидеть, есть ли какой-то конкретный аргумент, который он терпит неудачу или не может загрузить. Возможно, какой-то ресурс передается не так, как на оболочке (один автоматически завершает полное имя пути, например) –