2011-07-27 6 views
0

私は、Win7マシンのProgram Files(x86)フォルダにインストールしようとしているEXEをビルドしました。本当に面白い振る舞いが続いています。このプログラムは、インターフェイスを処理するためにwx-PythonとXRCを使用しています。配布物にXRCフォルダを含めます。このプログラムは、getcwd()を使用して自身を検索し、xrcフォルダを検索します。しかし、これは本当に興味深いことです。プログラムをProgram Filesに置くとうまくいきます。 Program Files x86フォルダにプログラムを配置すると、xrcフォルダが見つからないことを示すメッセージが表示されます。
私は、このアプリケーションがプログラムファイル内のXPマシンとVistaマシン、およびプログラムファイル内のWin7マシンで正常に動作することを明示してください。Progam Files X86とWin7のProgram FIlesから実行したときのPython exe動作が異常になっていますか?

ここで興味深いのは、プログラムのEXEをダブルクリックした場合ですファイル(x86)フォルダは正常に動作しますが、起動/プログラムメニューに追加されたショートカットを実行しようとすると正しく動作しません。プログラムがxrcフォルダを見つけられないことを示すエラーメッセージが表示されます。私はまた、デスクトップ上のフォルダにプログラムを移動し、ルートと他のすべての場所で起動し、正常に実行されます。したがって、私は自分のコードがxrcフォルダを指すことが良いと確信しています。

だから質問に戻る。プログラムがx86フォルダから実行されているときに、パス参照が不正になるようなことが起こっていますか?もっと重要なのは修正可能ですか?

最後に、問題がxrcフォルダへのパスに関連していることをできるだけ確認するために、アプリケーションの2つのインスタンスからxrcフォルダを削除し、プログラムがあったときに同じエラーメッセージが表示されるx86フォルダーにインストールされます。

私はスタートメニューやexeファイルにショートカットを使用するときだけ明確化のためのプログラムが実行されません唯一の時間であり、すべての部品が

Plasticsabersがanswerreally助けたプログラムファイル(x86の)フォルダに保存されています私は問題を理解しており、私はそれを修正することができました。これはVistaのverus XPの問題ではなく、32ビットのOSと64ビットの問題です。

64ビットXPと32ビットWin7で実行する必要があります。

答えて

0

this noteによると、Program Files(x86)フォルダは、64ビットプログラム用のProgram Filesフォルダではなく、32ビットのプログラムファイルを対象としています。

しかし、32ビットプログラムが32ビットマシン上にあるようにふるまうためには、作業ディレクトリの名前は32ビットシステム上にあるため、「プログラムファイル」として返されなければなりません。ビットマシン。これは、Windowsにgetcwd()で作業ディレクトリを要求したときに表示されます。あなたのプログラムはそのディレクトリ名をパスで使用しようとしているため、実際の64ビットマシン上のファイルへのパスではないため、破損します。

WOW64 docsを見ると、スタートメニューから起動すると64ビットプロセスが作成されるため、システムがProgramFiles環境変数を変更する原因になります。ダブルクリックして起動する場合は、最初から32ビットのプロセスです。

あなたはこれに遭遇する唯一の人ではないようです。 this Windows APIは、あなたが説明している問題を回避するために特別に設計されているようです。他に何も表示されていない場合、あなたが見ている動作は設計によるものです。

これは学業です。この種のものから身を守るために、私はあなたのexeへの絶対パスを得るでしょう。os.path.realpath(__file__)のようなものを使って、そこから行ってください。

+0

なぜProgram Filesディレクトリにインストールされているバージョンで動作しますか?注目すべきは、私は数多くの場所にインストールされた全く同じアプリについて話しており、すべてのケースでスタートメニューにショートカットをインストールしました。あなたがこれを明確にすることができれば、私はそれを感謝します。 – PyNEwbie

+0

他のインストールへのリンクの中にフォルダを見つけることを可能にする「開始」フォルダがあれば、別の場所にインストールしても動作します。 –

+0

これを処理する典型的な方法は、sys.argv [0]から実行可能ファイルを起動し、それをos.path.abspath()に渡し、途中でパスすることです。 –

関連する問題