Runtime error R6034 in embedded Python application

前端 未结 13 1196
暗喜
暗喜 2020-12-04 10:06

I am working on an application which uses Boost.Python to embed the Python interpreter. This is used to run user-generated \"scripts\" which interact with the main program.<

相关标签:
13条回答
  • 2020-12-04 10:44

    In my case, I realised the problem was coming when, after compiling the app into an exe file, I would rename that file. So leaving the original name of the exe file doesn't show the error.

    0 讨论(0)
  • 2020-12-04 10:45

    (This might be better as a comment than a full answer, but my dusty SO acct. doesn't yet have enough rep for that.)

    Like the OP I was also using an embedded Python 2.7 and some other native assemblies.

    Complicating this nicely was the fact that my application was a med-large .Net solution running on top of 64-Bit IIS Express (VS2013).

    I tried Dependency Walker (great program, but too out of date to help with this), and Process Monitor (ProcMon -- which probably did find some hints, but even though I was using filters the problems were buried in thousands of unrelated operations, better filters may have helped).

    However, MANY THANKS to Michael Cooper! Your steps and Process Explorer (procexp) got me quickly to a solution that had been dodging me all day.

    I can add a couple of notes to Michael's excellent post.

    • I ignored (i.e. left unchanged) not just the \WinSxS\... folder but also the \System32\... folder.

    Ultimately I found msvcr90.dll being pulled in from:

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

    Going through my Path I found the above and another, similar directory which seemed to contain 32-bit versions. I removed both of these, restarted and... STILL had the problem.

    So, I followed Michael's steps once more, and, discovered another msvcr90.dll was now being loaded from:

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

    Going through my Path again, I found the above and an (x86) version of this directory as well. So, I removed both of those, applied the changes, restarted VS2013 and...

    No more R6034 Error!

    I can't help but feel frustrated with Intel for doing this. I had actually found elsewhere online a tip about removing iCLS Client from the Path. I tried that, but the symptom was the same, so, I thought that wasn't the problem. Sadly iCLS Client and OpenCL SDK were tag-teaming my iisexpress. If I was lucky enough to remove either one, the R6034 error remained. I had to excise both of them in order to cure the problem.

    Thanks again to Michael Cooper and everyone else for your help!

    0 讨论(0)
  • 2020-12-04 10:46

    This post elaborates on @Micheal Cooper and @frmdstryr. Once you identified the problematic PATH entries, you can put the following in front of a python script, assuming here that iCLS Client and CMake are problematic.

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

    Concerning the vim with YouCompleteMe case, you can put the following at the top of your 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
    

    If none of these solutions is applicable for you, you can try to remove the problem causing entries from you PATH manually, but you want to make sure you don't break anything else on your system that depends on these PATH entries. So, for instance, for CMake you could try to remove its PATH entry, and only put a symlink (or the like) pointing to the cmake.exe binary into some other directory that is in your PATH, to make sure cmake is still runnable from anywhere.

    0 讨论(0)
  • 2020-12-04 11:01

    I found the solution to the problem. Hopefully this will help someone else--these problems can be so frustrating to debug.

    The problem was caused by third-party software that had added itself to the path and installed msvcr90.dll in its program folder. In this case, the problem was caused by Intel's iCLS Client.

    So... How to find the problem in similar situations?

    1. Download Process Explorer here.

    2. Start your application and reproduce runtime error R6034.

    3. Start Process Explorer. In the "View" menu go to "Lower Pane View" and choose "DLLs".

    4. In the top pane, locate your application and click on it. The bottom pane should show a list of DLLS loaded for your application.

    5. Locate "msvcr??.dll" in the list. There should be several. Look for the one that is not in the "winsxs" folder, and make a note of it.

    6. Now, check the path just before your application runs. If it includes the folder you noted in step 5, you've probably found the culprit.

    How to fix the problem? You'll have to remove the offending entry from the path before running your program. In my case, I don't need anything else in the path, so I wrote a simple batch file that looks like this:

    path=
    myprogram.exe
    

    That's it. The batch file simply clears the path before my program runs, so that the conflicting runtime DLL is not found.

    Hope this helps!

    0 讨论(0)
  • 2020-12-04 11:02

    A more general solution is:

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

    (I had the same problem with VanDyke SecureCRT)

    0 讨论(0)
  • 2020-12-04 11:02

    Using Michael's answer above, I was able to resolve this without a bat file by adding:

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

    to the main python file of the application. It just makes sure system path didn't include the paths that were causing the issue before the libraries that loaded the dll's were imported.

    Thanks!

    0 讨论(0)
提交回复
热议问题