从Python调用时,外部命令失败,返回码0xC0000005,但可在控制台中使用
作者:互联网
我有一个在Windows下运行的python 3.5脚本,它在许多文件上调用了外部问题(准确地说是BLAST套件中的tblastn).在大多数这些文件中,它运行良好,但在某些文件上,失败,返回码为0xC0000005.如果我使用完全相同的命令行调用,并从控制台在同一当前工作目录中运行它,则可以正常执行.
我目前正在使用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,都会发生这种情况.
每次我运行代码时,失败的文件是相同的,但是如果放入不同的文件列表中进行处理,则相同的文件将起作用.更改调用方法有时会更改哪些文件失败,因此与subprocess.Popen相比,使用os.system可能会导致其他文件失败.因此,看来我不是在调用tblastn到哪个文件.
有谁知道什么可能导致这种行为?
或者,如果有人知道在创建的进程中运行(文档说它使用CreateProcess())与从命令行运行相比可能有什么不同,那么至少我有个地方可以开始吗?
解决方法:
错误代码很可能是“访问被拒绝”(尽管Windows头文件中有4个代码结构,但访问被拒绝最有可能的原因是:
# for hex 0xc0000005 / decimal -1073741819
FILE_LOG_INFORMATION_FAILED iasmsg.h
# Information for the %1 log could not be logged to the text
# file %2 in the path %3. Error code: %0
STATUS_ACCESS_VIOLATION ntstatus.h
# The instruction at 0x%08lx referenced memory at 0x%08lx.
# The memory could not be %s.
USBD_STATUS_DEV_NOT_RESPONDING usb.h
# as an HRESULT: Severity: FAILURE (1), FACILITY_NULL (0x0), Code 0x5
# for hex 0x5 / decimal 5
ERROR_ACCESS_DENIED winerror.h
# Access is denied.
我将首先查看用于运行原始(启动/父)脚本的用户特权/凭证,该子进程/子进程将从该脚本继承其凭据…然后将其与“运行”时使用的凭据进行比较正如您所描述的,在cmd提示符下显示”.
HTH,
埃德温.
标签:python-3-x,operating-system,external,python 来源: https://codeday.me/bug/20191119/2032281.html