web-dev-qa-db-ja.com

組み込みのランタイムエラーR6034 Python application

Boost.Pythonを使用してPythonインタープリターを埋め込むアプリケーションです。これは、メインプログラムと対話するユーザー生成の「スクリプト」を実行するために使用されます。

残念ながら、あるユーザーがスクリプトを実行しようとすると、ランタイムエラーR6034を報告しています。メインプログラムは正常に起動しますが、python27.dllがロードされているときに問題が発生していると思われます。

Visual Studio 2005、Python 2.7、およびBoost.Python 1.46.1を使用しています。この問題は1人のユーザーのマシンでのみ発生します。以前にマニフェストの問題に対処し、それらを解決することができました。 、しかし、この場合、私は少し損をしています。

他の誰かが同様の問題に遭遇しましたか?解決できましたか?どうやって?

37
Michael Cooper

問題の解決策を見つけました。これが他の誰かの助けになることを願っています-これらの問題はsoデバッグにイライラする可能性があります。

この問題は、パスに自分自身を追加し、プログラムフォルダーにmsvcr90.dllをインストールしたサードパーティソフトウェアが原因で発生しました。この場合、問題はIntelのiCLSクライアントによって引き起こされました。

だから...同様の状況で問題を見つける方法は?

  1. Process Explorerをダウンロード here

  2. アプリケーションを起動し、ランタイムエラーR6034を再現します。

  3. Process Explorerを起動します。 [表示]メニューで、[下位ペインビュー]に移動し、[DLL]を選択します。

  4. 上部ペインで、アプリケーションを見つけてクリックします。下のペインに、アプリケーションにロードされたDLLのリストが表示されます。

  5. リストで「msvcr ??。dll」を見つけます。いくつかあるはずです。 「winsxs」フォルダーにないものを探し、メモします。

  6. 次に、アプリケーションを実行する直前にパスを確認します。手順5でメモしたフォルダーが含まれている場合は、おそらく犯人が見つかりました。

問題を修正するには?プログラムを実行する前に、問題のあるエントリをパスから削除する必要があります。私の場合、パスには他に何も必要ないので、次のような単純なバッチファイルを作成しました。

path=
myprogram.exe

それでおしまい。バッチファイルは、プログラムの実行前にパスをクリアするだけなので、競合するランタイムDLLが見つかりません。

お役に立てれば!

94
Michael Cooper

より一般的な解決策は次のとおりです。

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でも同じ問題がありました)

4
Lee Kamentsky

この投稿では、@ Micheal Cooperと@frmdstryrについて詳しく説明し、以前の回答よりも優れた代替案を提供します。 python scriptの前に次を入力すると、問題のあるエントリを削除できます。

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)

vim with YouCompleteMeの場合、次のtopvimrcに入れることができます:

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
4

(これは完全な回答よりもコメントとして良いかもしれませんが、私のほこりっぽいSO acct。にはまだ十分な担当者がいません。)

OPのように、組み込みのPython 2.7およびその他のネイティブアセンブリも使用していました。

これをうまく複雑にしているのは、私のアプリケーションが64ビットIIS Express(VS2013))上で実行される中規模の.Netソリューションであるという事実でした。

Dependency Walker(素晴らしいプログラムですが、これを支援するには古すぎます)、およびProcess Monitor(ProcMon-おそらくいくつかのヒントが見つかりましたが、フィルターを使用していても、問題は数千の無関係な操作に埋もれていましたが、より良いフィルターが役立ったかもしれません)。

しかし、Michael Cooperに感謝します!あなたの手順とプロセスエクスプローラー(procexp)は、私を1日中避けていたソリューションにすぐに連れて行ってくれました。

Michaelの素晴らしい投稿にいくつかメモを追加できます。

  • \ WinSxS\...フォルダーだけでなく、\ System32\...フォルダーも無視しました(つまり、変更しませんでした)。

最終的に、msvcr90.dllが次の場所からプルされていることがわかりました。

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

パスを調べてみると、上記と32ビットバージョンが含まれていると思われる別の類似のディレクトリが見つかりました。これらの両方を削除して再起動しました...[〜#〜] still [〜#〜]に問題がありました。

そこで、マイケルの手順をもう一度実行し、anothermsvcr90.dllが次の場所からロードされていることを発見しました。

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

パスをもう一度調べてみると、上記とこのディレクトリの(x86)バージョンも見つかりました。だから、私はそれらの両方を削除し、変更を適用し、VS2013を再起動しました...

R6034エラーはもうありません!

私はこれを行うためにインテルに不満を感じずにはいられません。私は実際に他のオンラインで、パスからiCLSクライアントを削除するためのヒントを見つけました。私はそれを試しましたが、症状は同じだったので、それは問題ではないと思いました。悲しいことに、iCLSクライアントとOpenCL SDKは私のiisexpressのタグチーミングでした。どちらかを削除できるほど幸運だった場合、R6034エラーが残りました。問題を解決するために、両方を切除しなければなりませんでした。

マイケル・クーパーと他の皆さんにあなたの助けをありがとう!

2
thomas iota

上記のMichaelの回答を使用して、次を追加することで、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をロードしたライブラリがインポートされる前にシステムパスに問題の原因となったパスが含まれていないことを確認するだけです。

ありがとう!

2
frmdstryr

この投稿では、@ Micheal Cooperと@frmdstryrについて詳しく説明しています。問題のあるPATHエントリを特定したら、python scriptの前に次を追加できます。ここで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])

vim with YouCompleteMeケースに関しては、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からエントリを引き起こしている問題を削除しようとすることができますが、これらのPATHエントリに依存するシステムで他のものを壊さないようにしたいです。したがって、たとえば、CMakeの場合、PATHエントリを削除して、cmake.exeバイナリを指すシンボリックリンク(など)をPATHにある他のディレクトリに配置するだけで、cmakeが実行可能であることを確認できます。どこからでも。

2

解決策をありがとう。システムのパス変数に「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)])
1
abhijit

まだ解決策を探している人にこの答えを追加します。 ESRIはこのエラーのパッチをリリースしました。 Webサイトからパッチをダウンロードするだけで(ログインは不要)、インストールするだけで問題は解決します。 10.4.1用のパッチをダウンロードしましたが、他のバージョン用のパッチもあるかもしれません。

0

私の場合、リンクされたライブラリと、同様の「ランタイム実行ライブラリ」プロジェクト設定を持つメインプロジェクトの再構築が役立ちました。それが誰にとっても役に立つことを願っています。

0

私の場合、アプリをexeファイルにコンパイルした後、そのファイルの名前を変更すると問題が発生することに気付きました。したがって、exeファイルの元の名前を残してもエラーは表示されません。

0
Macumbaomuerte

埋め込みに同じ問題がありましたPython27.dllUniversal-CRTを使用したCプログラムから。

<PYTHON_ROOT>\msvcr90.dllは違反者でした。そして、<PYTHON_ROOT>は私のPATHではコース外です。 AFAICSの唯一のユーザーmsvcr90.dllPyWin32 モジュール<PYTHON_ROOT>\lib\site-packages\win32\win32*.pyd

修正は移動するだけでした<PYTHON_ROOT>\msvcr90.dllそのディレクトリに。

[〜#〜] ps [〜#〜]。 PyWin32はこれを issue 7年後もまだ持っています!

0
G.Vanem

このページでの議論には、私よりもはるかに高度なことを行うことが含まれます。 (コーディングしません。)それでも、推奨される診断としてProcess Explorerを実行しました。別のプログラムがプログラムフォルダー内のmsvcr90.dllを使用し、必要としていることがわかりました。ここで議論されている他のことを理解していないので、私は一時的にdllを隣接するプログラムフォルダに移動しました。

問題が解決しました。ランタイムエラーメッセージの終わり。

(エラーメッセージを生成するプログラムが終了したら、dllを元に戻しました。)

あなたの助けとアイデアをありがとう。

0
CJ Cotter