Błąd Runtime R6034 w osadzonej aplikacji Pythona

Pracuję nad aplikacją wykorzystującą Boost.Python do osadzenia interpretera Pythona. Służy do uruchamiania generowanych przez użytkownika "skryptów", które wchodzą w interakcję z głównym programem.

Niestety, jeden użytkownik zgłasza błąd runtime R6034, gdy próbuje uruchomić skrypt. Główny program uruchamia się dobrze, ale myślę, że problem może wystąpić, gdy python27.dll jest załadowany.

Używam Visual Studio 2005, Python 2.7 i Boost.Python 1.46.1 Problem występuje tylko na jednym użytkowniku maszyna. Miałem już do czynienia z oczywistymi problemami i udało mi się je rozwiązać, ale w tym przypadku jestem trochę zagubiony.

Czy ktoś jeszcze miał podobny problem? Udało Ci się to rozwiązać? Jak?

Author: ROMANIA_engineer, 2013-01-28

11 answers

Znalazłem rozwiązanie problemu. Mam nadzieję, że to pomoże komuś innemu-te problemy mogą być więc frustrujące, aby debugować.

Problem był spowodowany przez oprogramowanie innych firm, które dodało się do ścieżki i zainstalowało msvcr90.dll w folderze programu. W tym przypadku problem był spowodowany przez klienta iCLS firmy Intel.

Więc... Jak znaleźć problem w podobnych sytuacjach?
  1. Pobierz Process Explorer tutaj .

  2. Uruchom aplikację i odtworz błąd runtime R6034.

  3. Uruchom Process Explorer. W menu" Widok "przejdź do" Widok dolnego panelu "i wybierz " biblioteki DLL".

  4. W górnym okienku znajdź swoją aplikację i kliknij ją. W dolnym okienku powinna znajdować się lista bibliotek DLL załadowanych dla Twojej aplikacji.

  5. Zlokalizuj " msvcr??.dll " na liście. Powinno być ich kilka. Poszukaj tego, którego nie ma w folderze "winsxs" i zanotuj to.

  6. Teraz sprawdź ścieżkę tuż przed uruchomieniem aplikacji. Jeśli zawiera folder opisany w kroku 5, prawdopodobnie znalazłeś winowajcę.

Jak rozwiązać problem? Przed uruchomieniem programu będziesz musiał usunąć ten wpis ze ścieżki. W moim przypadku nie potrzebuję niczego więcej w ścieżce, więc napisałem prosty plik wsadowy, który wygląda tak:

path=
myprogram.exe
To wszystko. Plik wsadowy po prostu czyści ścieżkę przed moim program jest uruchamiany tak, że nie znaleziono biblioteki DLL conflicting runtime. Mam nadzieję, że to pomoże!
 88
Author: Michael Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-04 05:35:38

Bardziej ogólnym rozwiązaniem jest:

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

(miałem ten sam problem z VanDyke SecureCRT)

 4
Author: Lee Kamentsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-08 13:17:13

Ten post rozwija @Micheal Cooper i @ frmdstryr i daje lepszą alternatywę niż moja wcześniejsza odpowiedź. Aby usunąć problematyczne wpisy, możesz umieścić następujący tekst przed skryptem Pythona.

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)

W przypadku vim z youcompleteme możesz umieścić następujący na górze twojego 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
 3
Author: Chiel ten Brinke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 09:31:24

Korzystając z powyższej odpowiedzi Michaela, udało mi się to rozwiązać bez pliku bat dodając:

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

Do głównego pliku Pythona aplikacji. Po prostu upewnia się, że ścieżka systemowa nie zawiera ścieżek, które powodowały problem, zanim biblioteki, które załadowały biblioteki dll zostały zaimportowane.

Dzięki!
 2
Author: frmdstryr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 18:35:03

(to może być lepsze jako komentarz niż pełna odpowiedź, ale mój zakurzony tak acct. nie ma jeszcze wystarczająco reputacji.)

Podobnie jak OP, używałem również osadzonego Pythona 2.7 i kilku innych natywnych zestawów.

Komplikuje to ładnie fakt, że moja aplikacja była rozwiązaniem med-large. Net działającym na 64-bitowym IIS Express (VS2013).

Próbowałem Dependency Walker (świetny program, ale zbyt Nieaktualny, aby w tym pomóc), i Process Monitor (ProcMon -- co prawdopodobnie znalazło kilka wskazówek, ale mimo, że używałem filtrów, problemy zostały pogrzebane w tysiącach niepowiązanych operacji, lepsze filtry mogły pomóc).

Jednakże, wielkie podziękowania dla Michaela Coopera! Twoje kroki i Process Explorer (procexp) szybko doprowadziły mnie do rozwiązania, które unikało mnie przez cały dzień.

Mogę dodać kilka notek do doskonałego posta Michaela.

  • zignorowałem (tzn. pozostawiłem bez zmian) nie tylko \WinSxS\... folder ale również \System32\... folder.

Ostatecznie znalazłem msvcr90.dll jest pobierany z:

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

Przechodząc przez moją ścieżkę znalazłem powyższy i inny, podobny katalog, który wydawał się zawierać wersje 32-bitowe. Usunąłem oba, uruchomiłem ponownie i... nadal miał problem.

Więc, poszedłem po śladach Michaela jeszcze raz i odkryłem kolejny msvcr90.dll był teraz ładowanie z:

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

Przechodząc ponownie przez moją ścieżkę, znalazłem powyższą i (x86) wersję tego katalogu. Tak więc usunąłem oba, zastosowałem zmiany, uruchomiłem ponownie VS2013 i...

Koniec z błędem R6034!

Nic nie poradzę, ale czuję się sfrustrowany wywiadem za to. W rzeczywistości znalazłem w innym miejscu Online poradę na temat usuwania klienta iCLS ze ścieżki. Próbowałem, ale objaw to było to samo, więc myślałem, że to nie jest problem. Niestety iCLS Client i OpenCL SDK były tag-teaming mój iisexpress. Jeśli miałem szczęście, aby usunąć jeden z nich, błąd R6034 pozostał. Musiałem pozbyć się ich obu, żeby wyleczyć problem.

Jeszcze raz dziękuję Michaelowi Cooperowi i wszystkim innym za pomoc!

 2
Author: thomas iota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 19:46:15

[[5]] Ten post rozwija się na @ Micheal Cooper i @ frmdstryr. Po zidentyfikowaniu problematycznych wpisów ścieżki można umieścić następujące skrypt Pythona , zakładając tutaj, że iCLS Client i CMake są problematyczne.

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

Jeśli chodzi o vim z youcompleteme, możesz umieścić następujący na górze twojego 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

Jeśli żadne z tych rozwiązań nie ma dla Ciebie zastosowania, możesz spróbować usunąć problem powodujący wpisy z twojej ścieżki ręcznie, ale chcesz się upewnić, że nie złamiesz niczego innego na swoim system, który zależy od tych wpisów ścieżki. Tak np. dla CMake można spróbować usunąć jego wejście ścieżka, i umieścić tylko dowiązanie symboliczne (lub podobne) wskazujące na cmake.exe binary do niektórych inny katalog, który znajduje się w twojej ścieżce, aby upewnić się, że cmake jest nadal uruchamiany z dowolnego miejsca.

 2
Author: Chiel ten Brinke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-22 09:28:18

Dzięki za rozwiązanie. Po prostu trochę zmodyfikowałem ten przykładowy kod, ponieważ zmienna path w moim systemie zawiera ciąg znaków "ICLS CLIENT"zamiast" 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)])
 1
Author: abhijit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-20 14:08:59

W moim przypadku pomogła przebudowa połączonych bibliotek i głównego projektu z podobnym ustawieniem projektu "Runtime execution libraries". Mam nadzieję, że to będzie przydatne dla każdego.

 0
Author: Aleksandr Shumilov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 01:23:02

W moim przypadku zdałem sobie sprawę, że problem pojawia się, gdy po skompilowaniu aplikacji do pliku exe zmienię nazwę tego pliku. Więc pozostawienie oryginalnej nazwy pliku exe nie pokazuje błędu.

 0
Author: Macumbaomuerte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 09:05:40

Dyskusja na tej stronie polega na robieniu rzeczy znacznie wyżej ode mnie. (Nie koduję.) Niemniej jednak uruchomiłem Process Explorer jako zalecaną diagnostykę. Okazało się, że inny program używa i potrzebuje msvcr90.dll w folderze programu. Nie rozumiejąc niczego innego omawianego tutaj, jako Dzikie odgadnięcie tymczasowo przeniosłem dll do sąsiedniego folderu programu.

Problem rozwiązany. Koniec Komunikatu o błędzie Runtime.

(przeniosłem dll z powrotem, gdy skończyłem z program generujący komunikat o błędzie.)

Dziękuję wszystkim za pomoc i pomysły.

 0
Author: CJ Cotter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 04:48:02

Dodanie tej odpowiedzi dla tego, kto nadal szuka rozwiązania. ESRI wydała łatkę na ten błąd. Wystarczy pobrać łatkę z ich strony internetowej (nie wymaga logowania), zainstalować ją i rozwiąże problem. Ściągnąłem łatkę do 10.4.1, ale może są też łatki do innych wersji.

 0
Author: Dinh Quang Duong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 08:18:09