从Python调用外部命令时失败,返回代码0xc000005,但在cons中工作

2024-09-30 01:21:27 发布

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

我有一个在Windows下运行的python3.5脚本,它调用了大量文件的外部问题(确切地说是BLAST+套件中的tblastn)。对于大多数这些文件,它运行得很好,但对于某些文件,它会失败,返回代码0xc000005。如果我使用完全相同的命令行调用,并从控制台在同一个当前工作目录中运行它,它执行得很好。在

我当前使用subprocess.Popen运行命令,如下所示:

childProcess = subprocess.Popen(blast_cmd, stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                     universal_newlines=True,shell=True)

然后调用subprocess.poll()直到完成。我通过同时运行四个进程来实现这一点,但是如果我一次强制运行一个进程,仍然会发生这种情况。同样的情况发生在os.systemsubprocess.run()subprocess.call()和{}中,无论我将shell设置为True还是{},都会发生这种情况。在

每次运行代码时,它失败的文件都是相同的,但如果将同一个文件放入不同的文件列表中进行处理,则相同的文件将起作用。更改调用方法有时会更改哪些文件失败,因此使用os.system可能会导致与subprocess.Popen不同的文件失败。因此,似乎并不取决于我在哪个文件上调用tblastn。在

有人知道是什么导致了这种行为吗?在

或者,如果有人知道在创建的进程中运行(文档中说它使用CreateProcess())与从命令行运行有什么不同,那么至少我有地方可以开始?在


Tags: 文件代码命令行脚本true进程oswindows
2条回答

错误代码很可能是“拒绝访问”(虽然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提示符上运行此命令”时使用的凭据进行比较。在

嗯, 埃德温。在

  1. 以编程方式启动的子进程通常会获得其他内存设置(堆大小等),而不是交互启动的进程。所以试着放一些堆/内存检查包装tblastn.exe. 您对“在一个文件上失败,但在另一个文件列表中进行处理”的描述表明,错误与失败的调用本身无关,而是与先前活动导致的某些情况有关。在
  2. 输出缓冲在内存中。如果tblastn有很多输出,则使用communicate()来作废(或使用)子进程的输出。在
  3. 调用可执行文件时不需要shell=True,它的目的是执行shell内建。用这个你用一个无谓的命令提示符. 在

相关问题 更多 >

    热门问题