运行时错误R6034在嵌入式Python应用程序(Runtime error R6034 in em

2019-07-18 19:18发布

我的工作,它使用Boost.Python的嵌入Python解释器的应用程序。 这被用于运行用户生成“脚本”,其与主节目进行交互。

不幸的是,一个用户报告运行时错误R6034当他试图运行的脚本。 主程序精细启动,但我想加载python27.dll时,可能出现故障。

我使用Visual Studio 2005中的Python 2.7和Boost.Python的1.46.1。 只有一个用户的机器出现问题。 我以前已经经历了明显的问题,并设法解决这些问题,但在这种情况下,我在一个小的损失的。

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

Answer 1:

我找到了解决问题的办法。 希望这会帮助别人-这些问题都这么折腾调试。

这个问题是由曾在其程序文件夹本身添加到路径和MSVCR90.DLL安装第三方软件引起的。 在这种情况下,问题是由英特尔公司的ICL客户端造成的。

所以......如何找到在类似情况下的问题?

  1. 下载Process Explorer的位置 。

  2. 启动应用程序,并复制运行时错误R6034。

  3. 启动进程资源管理器。 在“查看”菜单进入“下窗格视图”,然后选择“DLL文件”。

  4. 在顶部窗格中,找到您的应用程序并点击它。 底部窗格应显示加载应用程序的DLL文件。

  5. 在列表中找到 “msvcr ?? DLL”。 应该有几个。 认准一个不是在“winsxs文件”文件夹,并记下它。

  6. 现在,检查路径的应用程序运行之前。 如果它包含在步骤5中记下的文件夹,你可能已经找到了罪魁祸首。

如何解决这一问题? 你必须在运行程序之前,请从路径问题的项。 就我而言,我不需要别的路径,所以我写了一个简单的批处理文件,看起来像这样:

path=
myprogram.exe

而已。 我的程序运行之前,使冲突运行时DLL找不到批处理文件简单地清除路径。

希望这可以帮助!



Answer 2:

一个更普遍的解决方案是:

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))])

(我有芬戴克SecureCRT的同样的问题)



Answer 3:

这篇文章阐述了@Micheal Cooper和@frmdstryr并给出了比我以前的答案是更好的选择。 你可以把下面的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


Answer 4:

使用上面迈克尔的回答,我能够加入到解决这个没有一个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文件。 它只是确保系统路径不包括被认为装载的是进口的dll库之前先造成问题的路径。

谢谢!



Answer 5:

(这可能是因为不是一个完整的答案评论更好,但我尘封SO ACCT,还没有对足够的代表。)

像OP我还使用了嵌入式Python 2.7和其他一些本地组件。

很好地复杂这是事实,我的应用程序是在64位上运行一个MED-大.NET解决方案IIS快递(VS2013)。

我试过的Dependency Walker(伟大的计划,但太落伍了,以帮助这一点),并且进程监视器(procmon中 - 这可能确实找到了一些线索,但即使我使用过滤器被埋在数千不相干的操作的问题,更好的过滤器可以帮助)。

然而, 非常感谢迈克尔-库珀! 你的步骤和进程资源管理器(procexp)让我很快到了一整天躲着我一个解决方案。

我可以添加一对夫妇的音符迈克尔的优秀文章。

  • 我忽略(即保持不变),而不仅仅是\ WinSxS文件\ ...文件夹而且\ SYSTEM32 \ ...文件夹中。

最后,我发现MSVCR90.DLL正在从拉在:

  • C:\ Program Files文件(x86)的\英特尔\ OpenCL的SDK \ 2.0 \ BIN \ 64

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

所以,我跟迈克尔的步骤一次,并发现了另一个 MSVCR90.DLL现在正在从加载:

  • C:\ Program Files文件\英特尔\的ICL客户端\

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

没有更多的R6034错误!

我不禁与英特尔感到沮丧,这样做的。 我实际上在其他地方发现网上小费大约从通道中取出的ICL客户端。 我试过了,但症状是一样的,所以,我认为这是没有问题的。 可悲的ICL客户端和OpenCL SDK进行标签包夹我iisexpress。 如果我很幸运,除去任何一个时,R6034错误依然存在。 我不得不为了根治这一问题切除他们两个。

再次感谢迈克尔 - 库珀和其他人对你的帮助!



Answer 6:

这篇文章阐述了@Micheal库珀和@frmdstryr。 一旦你确定有问题的路径条目,你可以把下面的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

如果这些解决方案适用于你,你可以尝试删除从您PATH手动引起的条目问题,但是你要确保你不破坏任何系统上的其他依赖于这些路径条目。 因此,例如,为CMake的你可以尝试删除其路径条目,只放一个符号链接(或类似)指向cmake.exe二进制成在PATH其他目录,以确保cmake的仍是可运行从任何地方。



Answer 7:

感谢您的解决方案。 在我的系统路径变量包含字符串“ICLS客户端”,而不是“客户的ICL”我只是小修改此示例代码

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)])


Answer 8:

在我的情况下链接库的重建,并与类似的“运行时执行库”项目设置主要的项目帮助。 希望这将是有用的人。



Answer 9:

就我而言,我意识到这个问题来了的时候,编译应用程序到一个exe文件后,我会重命名文件。 所以留下的exe文件的原始名称不显示错误。



Answer 10:

此页面上的讨论,包括做的事情我上面的方法非常先进。 (I不编码。)然而,我跑进程浏览器作为推荐的诊断。 我发现另一个程序使用,并在它的程序文件夹MSVCR90.DLL需要。 不理解什么都在这里被讨论,因为胡乱猜测我暂时搬到了DLL到邻近的程序文件夹。

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

(I移动的DLL回来时,我用程序产生错误消息结束。)

谢谢大家的帮助和想法。



Answer 11:

我也有同样的问题与嵌入Python27.dll使用通用-CRT的C程序。

<PYTHON_ROOT>\msvcr90.dll是罪犯。 和<PYTHON_ROOT>偏离当然在我PATH 。 AFAICS的唯一用户msvcr90.dll是PyWin32模块<PYTHON_ROOT>\lib\site-packages\win32\win32*.pyd

该修复程序只是移动<PYTHON_ROOT>\msvcr90.dll到该目录。

PS。 PyWin32仍然有此作为一个问题 7年后!



Answer 12:

添加这个答案谁仍然在寻找一个解决方案。 ESRI发布了一个补丁此错误。 只是从他们的网站(无需登录)下载补丁,安装它,它会解决这个问题。 我下载了补丁10.4.1但也有可能对其它版本也补丁。



文章来源: Runtime error R6034 in embedded Python application