2011-08-18 6 views
4

Python 2.6からPython 2.5を起動しようとしています。これは、私が使用しようとしているコンパイル済みライブラリ(GDAL)は、別のプログラム(ArcGIS)で配布されているPythonのバージョンではサポートされていないためです。Pythonサブプロセスの起動にランチャーによって異なる動作が発生する

ここに私がしようとしていることがあります。 Pythonの2.6でmain.pyファイル:

import subprocess 
p = subprocess.Popen(['C:\OSGeo4W\gdal_python_exec.bat', 'X:\\local\\import_tests.py']) 

gdal_python_exec.batはまた、いくつかの環境変数を設定しながら、私が欲しいのPythonの2.5バージョンをアップ発射Windowsバッチスクリプトです:

GDALをインポートしよう import_tests.py
@echo off 
set OSGEO4W_ROOT=C:\OSGeo4W 
PATH=%OSGEO4W_ROOT%\bin;%PATH% 
for %%f in (%OSGEO4W_ROOT%\etc\ini\*.bat) do call %%f 
@echo on 

@C:\OSGeo4W\bin\python.exe %1 

try: 
    from osgeo import gdal 
    raw_input('Imported! (Press enter)') 
except Exception, e: 
    print(e) 
    raw_input('Failed! (Press enter)') 

私はpython.exe main.py(そのようDOSコマンドラインでmain.pyを実行しますPythonのArcの2.6バージョン)では、問題なく動作します。しかし、同じスクリプトを使って、メインアプリケーションの中の「ツールボックス」として追加してそこから起動すると、import_tests.pyファイル内のGDALライブラリのDLLが見つかりません!

subprocessが別のPythonインタプリタを起動しているモジュールの場合、どうしてですか?何が起きているのかについてのアイデアはありますか?

を編集します。os.environ['PATH']の変数が両方の呼び出しで同じであることを確認できます。

Edit2:C:\Program Files\ArcGIS...\Binディレクトリには、私のpythonバインディングと互換性のないdllが含まれていました。 Windowsは最初にcwdを検索し、そのdllをロードしようとしましたが、失敗し、「dllが見つかりません」というエラーが報告されました。

+0

メインアプリケーションにはどのようなGUIを使用していますか? gdalはどんなdllを読み込もうとしますか?いずれかが正常に読み込まれますか? – Velociraptors

+0

メインGUIはArcGISです。私が知る限り、 'gdal'は' gdal.dll'を読み込もうとしますが、どうやって見つけられるのか分かりません。どうすれば確認できますか? – Rich

+0

[プロセスエクスプローラ](http://technet.microsoft.com)を使用できます。com/en-us/sysinternals/bb896653)を使用して、特定のプロセスがロードしたDLLを確認します。この場合、おそらくArcGISとすべてのPythonプロセスをチェックしたいと思うでしょう。あなたの元の問題を考えれば、ArcGISがPythonではなく*何かを中毒させている可能性が最も高いと言えます。 – Velociraptors

答えて

1

PATHが正しいかどうかにかかわらず、簡単なテストは異なる任意のディレクトリに変更し、python.exe C:\full\path\to\main.pyを実行することです。それが問題を再現するならば、それは何らかの種類のパス問題のです。

sys.pathを確認してください。違いはどこにあるのでしょうか。そうであれば、を使って、またはzc.buildout/zc.recipe.eggのように、正しいsys.pathを使ってconsole_scriptを生成するために、Pythonコードとライブラリにpython.exeからアクセスできるようにする必要があります。 。

+0

助けてくれてありがとうが、sys.pathは追加ディレクトリ以外の2つの呼び出し間で同じです。私は手動でそのディレクトリを削除する場合、私はまだ同じエラーが発生します。私はあなたが示唆したような絶対パスでスクリプトを呼び出すことも試みましたが、まだ何もありません。私がチェックできる他のアイデアはありますか? – Rich

+0

os.getcwd()はどうですか? –

+0

はい、それが問題でした。明らかに、GUIから実行されたときのcwdは、同じdllの異なるバージョンを持つディレクトリにありました。そのディレクトリから他の場所に移動すると、再び機能します。 – Rich

1

は、 "作業1はC:\ Windowsと壊れた1はC:\プログラムファイル\ ArcGISの... \ビン" という別の場所に投稿されたコメントから表示されます

os.chdirを有効にする。

[実際に何を意味するのかわからない、コメントは解析が難しいです。]

+0

'C:\ Program Files \ ArcGIS ... \ Bin'ディレクトリに、私のpythonバインディングと互換性のないdllが含まれていました(私はなぜWindowsは私のものではないのか分かりません)。 Windowsは最初にcwdを検索し、そのdllをロードしようとしましたが、失敗し、「dllが見つかりません」というエラーが報告されました。 – Rich

+0

@Rich:この種の情報はコメントには含まれません。それは質問の**必須の**部分です。 **この本質的な事実を含めるために質問を更新**してください。 –

+0

@Lottありがとうございました。質問は更新されました。 – Rich

関連する問題