embedded式Python应用程序中的运行时错误R6034

我正在使用Boost.PythonembeddedPython解释器的应用程序。 这用于运行与主程序交互的用户生成的“脚本”。

不幸的是,一个用户在运行脚本时报告运行时错误R6034。 主程序启动正常,但我认为这个问题可能在python27.dll加载时发生。

我正在使用Visual Studio 2005,Python 2.7和Boost.Python 1.46.1。 这个问题只发生在一个用户的机器上。 我之前已经处理了明显的问题,并设法解决它们,但是在这种情况下,我有点不知所措。

有没有其他人遇到类似的问题? 你能解决吗? 怎么样?

非常感谢你的帮助!

我find了解决问题的办法。 希望这会帮助别人 – 这些问题可能是如此令人沮丧的debugging。

这个问题是由第三方软件自己添加到path,并在其程序文件夹中安装msvcr90.dll造成的。 在这种情况下,问题是由英特尔的iCLS客户端引起的。

那么…如何在类似的情况下find问题?

  1. 在这里下载Process Explorer。

  2. 启动您的应用程序并重现运行时错误R6034。

  3. 启动Process Explorer。 在“View”菜单中,进入“Lower Pane View”并select“DLLs”。

  4. 在顶部窗格中,find您的应用程序并单击它。 底部窗格应显示为您的应用程序加载的DLLS列表。

  5. 在列表中find“msvcr ?? .dll”。 应该有几个。 查找不在“winsxs”文件夹中的文件,并记下它。

  6. 现在,在应用程序运行之前检查path。 如果它包含您在步骤5中记下的文件夹,则可能find了罪魁祸首。

如何解决这个问题? 运行程序之前,必须从path中删除违规的条目。 在我的情况下,我不需要任何其他的path,所以我写了一个简单的batch file,看起来像这样:

path= myprogram.exe 

而已。 batch file只是在我的程序运行之前清除path,以便找不到冲突的运行时DLL。

希望这可以帮助!

使用迈克尔的答案上面,我能够解决这个没有bat文件通过添加:

 import os # Remove CLS Client from system path if os.environ['PATH'].find("iCLS Client")>=0: os.environ['PATH'] = "".join([it for it in os.environ['PATH'].split(";") if not it.find("iCLS Client")>0]) 

到应用程序的主要python文件。 它只是确保系统path没有包括在加载DLL的库导入之前导致问题的path。

谢谢!

更一般的解决scheme是:

 import os os.environ['path'] = ";".join( [path for path in os.environ['path'].split(";") if "msvcr90.dll" not in map((lambda x:x.lower()), os.listdir(path))]) 

(我与VanDyke SecureCRT有同样的问题)

(这可能比一个完整的答案更好,但我尘土飞扬的SO acct。还没有足够的代表。)

就像OP一样,我也使用了embedded式的Python 2.7和一些其他的本地程序集。

这很好的解决了这个问题,我的应用程序是一个运行在64位IIS Express(VS2013)之上的中大型.Net解决scheme。

我尝试了Dependency Walker(伟大的程序,但过时了,以帮助这个),和进程监视器(ProcMon – 这可能确实发现了一些提示,但即使我使用filter的问题被埋在成千上万的无关的操作,更好的filter可能有帮助)。

不过,很多人对Michael Cooper表示谢意! 你的步骤和程序资源pipe理器(Procexp)让我迅速find了一整天都躲过我的解决scheme。

我可以给Michael的优秀文章添加几个注释。

  • 我忽略了(即保持不变)不只是\ WinSxS \ …文件夹,而且\ System32 \ …文件夹。

最终我发现msvcr90.dll被从:

  • C:\ Program Files(x86)\ Intel \ OpenCL SDK \ 2.0 \ bin \ x64

通过我的path我发现上面和另一个类似的目录,似乎包含32位版本。 我删除了这两个,重新启动和… 仍然有问题。

所以,我再次跟踪迈克尔的步骤,并发现另一个 msvcr90.dll现在被加载:

  • C:\ Program Files \ Intel \ iCLS Client \

再次通过我的path,我发现以上和(x86)版本的这个目录以及。 所以,我删除了这两个,应用更改,重新启动VS2013和…

没有更多的R6034错误!

我不禁感到沮丧与英特尔这样做。 实际上,我在其他地方发现了有关从path中删除iCLS客户端的提示。 我试过了,但症状是一样的,所以我认为这不是问题。 可悲的是,iCLS客户端和OpenCL SDK是我的iisexpress标签组合。 如果我很幸运能够删除任何一个,R6034错误仍然存​​在。 为了解决这个问题,我不得不把它们都切除。

再次感谢Michael Cooper和其他人的帮助!

这篇文章阐述了@Micheal Cooper和@frmdstryr。 一旦你确定了有问题的PATH条目,你可以把下面的代码放在一个Python脚本的前面,假设在这里, iCLS ClientCMake是有问题的。

 import os for forbidden_substring in ['iCLS Client', 'CMake']: os.environ['PATH'] = ';'.join([item for item in os.environ['PATH'].split(';') if not item.lower().find(forbidden_substring.lower()) >= 0]) 

关于与YouCompleteMe情况下的vim ,你可以把以下放在你的vimrc 的顶部

 python << EOF import os for forbidden_substring in ['iCLS Client', 'CMake']: os.environ['PATH'] = ';'.join([item for item in os.environ['PATH'].split(';') if not item.lower().find(forbidden_substring.lower()) >= 0]) EOF 

如果这些解决scheme都不适用于您,则可以尝试手动删除导致来自PATH的条目的问题,但是您要确保不会破坏取决于这些PATH条目的系统上的其他任何内容。 因此,例如,对于CMake,您可以尝试删除其PATH条目,并且只将指向cmake.exe二进制文件的符号链接(或类似链接)放入PATH中的其他目录中,以确保cmake仍可运行从任何地方。

这篇文章阐述了@Micheal Cooper和@frmdstryr,并给出了一个比我以前的答案更好的select。 你可以把下面的代码放在python脚本的前面来清除有问题的条目。

 import os, re path = os.environ['PATH'].split(';') def is_problem(folder): try: for item in os.listdir(folder): if re.match(r'msvcr\d\d\.dll', item): return True except: pass return False path = [folder for folder in path if not is_problem(folder)] os.environ['PATH'] = ';'.join(path) 

对于带有YouCompleteMe情况的vim ,可以 vimrc 的顶部放置以下内容:

 python << EOF import os, re path = os.environ['PATH'].split(';') def is_problem(folder): try: for item in os.listdir(folder): if re.match(r'msvcr\d\d\.dll', item): return True except: pass return False path = [folder for folder in path if not is_problem(folder)] os.environ['PATH'] = ';'.join(path) EOF 

感谢您的解决scheme。 我只是稍微修改了这个示例代码,因为我系统中的pathvariables包含string“ICLS CLIENT”而不是“iCLS Client”

 import os # print os.environ['PATH'] # Remove CLS Client from system path if os.environ['PATH'].find("iCLS Client") >= 0 or os.environ['PATH'].find("ICLS CLIENT") >= 0: os.environ['PATH'] = "".join([it for it in os.environ['PATH'].split(";") if not (it.find("iCLS Client")>0 or it.find("ICLS CLIENT")>0)]) 

在我的情况下,重build链接库和具有类似的“运行时执行库”项目设置的主项目帮助。 希望对任何人都有用。

就我而言,当我将应用程序编译成exe文件后,我意识到问题的出现,我将重命名该文件。 所以保留exe文件的原始名称不会显示错误。

这个网页上的讨论涉及远远超过我的做法。 (我没有编码)。然而,我运行了Process Explorer作为推荐的诊断。 我发现另一个程序使用并需要msvcr90.dll在它的程序文件夹。 不理解在这里讨论的任何东西,作为一个疯狂的猜测,我暂时把dll移到了一个相邻的程序文件夹。

问题解决了。 结束运行时错误消息。

(当我完成程序生成错误信息时,我将dll移回。)

谢谢大家的帮助和想法。

为谁还在寻找解决scheme添加这个答案。 ESRI为这个错误发布了一个补丁。 只需从他们的网站下载补丁(不需要login),安装它就可以解决问题。 我下载了10.4.1的补丁,但是也有可能是其他版本的补丁。