[英]Error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools” for Python module installing
[英]Microsoft Visual C++ Runtime Error in Python
我有一個連續在服務器上運行的python程序,它將一些數據放入MYSQL數據庫並加載一些。 它還使用TCP / IP連接。 問題是大約24小時后它會產生運行時錯誤:
Microsoft Visual C++ Runtime Library!
Runtime Error!
Program: C:\python27\pythonw.exe
This application has requested the Runtime to terminate it in an unusual way.
然后我打開OK python shell關閉。 當我關閉所有python文件並檢查Windows任務管理器時,我看到仍然有一個pythonw.exe文件打開!!!
我正在使用IDLE來運行我的應用程序。
問題
此應用程序已請求Runtime以不尋常的方式終止它。
如果你在運行Windows應用程序時遇到這個錯誤,很可能是因為python庫中的某個地方,甚至可能是你的python運行時,調用了abort()
例程。 有關更多信息以及調用abort
的行為,請參閱有關中止的MSDN文檔
演示
你需要
創建一個調用abort()
的C DLL,然后使用ctypes調用此DLL
頭文件abort_dll.h
#include<cstdlib>
#include <windows.h>
extern "C" __declspec(dllexport) void call_abort(void);
來源abort_dll.cpp
#include "abort_dll.h"
__declspec(dllexport) void call_abort(void)
{
abort();
}
來源dllmain.cpp
#include "abort_dll.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
現在編譯和構建你的DLL(在Debug和Release Version中)。
假設我的DLL存在於以下位置
調試版本:C:\\ TEMP \\ Debug \\ abort_dll.dll發行版:C:\\ TEMP \\ Release \\ abort_dll.dll
在IDLE中執行以下代碼
from ctypes import *
hDLL = WinDLL(r"C:\TEMP\Debug\abort_dll.dll")
hDLL.call_abort()
您一定會看到以下彈出窗口
與你的情況唯一不同的是,它為你提供了臭名昭着的選項[Abort | Retry \\ Ignore]。 這只是因為我使用了我的DLL的Debug版本。 相反,如果我使用了發布版本,我通常會看到
解
在Windows,AFAIK中,您無法使用信號處理程序處理SIGABRT
。 所以,唯一的賭注是使用JIT,我想你已經安裝了。 然后你會看到以下彈出窗口。
如果選擇Debug,將打開已安裝的JIT調試器。 之后,您可以轉儲發生故障的堆棧,並確定發生故障的模塊。 完成后,您可以關聯可能已調用模塊的python模塊。
在我之前的回答中,我試圖介紹報告行為的原因以及如何調試和確定根本原因。 不幸的是,這需要大量的調試知識和時間來隔離問題。
或者, Process Monitor可以方便地對問題進行高級別的理解,這可能是用戶可能需要的。
需要的工具
調試步驟
添加以下過濾器(Cntrl + F)
在LOG中搜索對WerFault.exe的調用
逐漸向上滾動以查看可能與Python相關的最后一個名為Non Windows DLL。 在上面的例子中,它的abort_dll.dll。
通過消除已啟動但尚未顯示的圖,我能夠解決同樣的問題。 它是:
plt.plot(dI_new[ref:idx_stop], w_new[ref:idx_stop], 'ro') #x,y
plt.xlabel('Strain')
plt.ylabel('Stress, kPa')
##plt.axis([0, 6, 0, 20])
##plt.show()
我解決它:
##plt.plot(dI_new[ref:idx_stop], w_new[ref:idx_stop], 'ro') #x,y
##plt.xlabel('Strain')
##plt.ylabel('Stress, kPa')
##plt.axis([0, 6, 0, 20])
##plt.show()
該錯誤不再顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.