我的工作,它使用Boost.Python的嵌入Python解释器的应用程序。 这被用于运行用户生成“脚本”,其与主节目进行交互。
不幸的是,一个用户报告运行时错误R6034当他试图运行的脚本。 主程序精细启动,但我想加载python27.dll时,可能出现故障。
我使用Visual Studio 2005中的Python 2.7和Boost.Python的1.46.1。 只有一个用户的机器出现问题。 我以前已经经历了明显的问题,并设法解决这些问题,但在这种情况下,我在一个小的损失的。
有没有其他人遇到类似的问题? 是你能解决吗? 怎么样?
Answer 1:
我找到了解决问题的办法。 希望这会帮助别人-这些问题都这么折腾调试。
这个问题是由曾在其程序文件夹本身添加到路径和MSVCR90.DLL安装第三方软件引起的。 在这种情况下,问题是由英特尔公司的ICL客户端造成的。
所以......如何找到在类似情况下的问题?
下载Process Explorer的位置 。
启动应用程序,并复制运行时错误R6034。
启动进程资源管理器。 在“查看”菜单进入“下窗格视图”,然后选择“DLL文件”。
在顶部窗格中,找到您的应用程序并点击它。 底部窗格应显示加载应用程序的DLL文件。
在列表中找到 “msvcr ?? DLL”。 应该有几个。 认准一个不是在“winsxs文件”文件夹,并记下它。
现在,检查路径的应用程序运行之前。 如果它包含在步骤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 Client
和CMake
是有问题的。
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