2012-02-10 4 views
5

py2exeを使用してWindows .exeにコンパイルするPythonプログラムがあります。 Inno Setupを使用して、Windowsインストーラを作成します。Windows上でPythonのimport()パスにスクリプトの作業フォルダを追加する最も良い方法は?

私のプログラムの性質は、後で__import__()ステートメントを使用してインポートされるプラグインを使用するようなものです。これらのプラグインは、自分のプログラムの.exeファイルが存在する場所のサブフォルダとして 'plugins'フォルダにあります。ユーザーがWindowsを介して、プログラムを起動したとき、これはうまく働いていなかった、しかし

sys.path+= ['.'] 

は今、プログラムは、プラグインを見つける持っている、それは、以前の私のファイルの先頭にsomwhere次のステートメントを持っていました明らかに作業フォルダが(.exeがどこにあるかではなく)スタートメニューに設定されていたためです。だから '.'は私が望むものに解決しなかった。

__import__()文はまた、(argv[0]は、実行可能ファイルのフルパスであるため).exeファイルがあるフォルダに見えるように、私は、次のようにステートメントを変更することにより、それを修正:

sys.path+= [os.path.dirname(sys.argv[0])] 

しかし、正しい解決方法を選んだかどうかはわかりません。特に、私のプログラムはクロスプラットフォーム(Windows、OSX、Linux)を意図しており、sys.argv documentationはargv [0]について、これがフルパス名かどうかに依存するオペレーティングシステムであると言います。

私はこれを別の方法で解決すべきですか、それとも私のアプローチはOKですか?

答えて

0

モジュールの__file__を使用してください。あなたは、これはのsys.pathにあなたのモジュールの親ディレクトリを追加します

sys.path+=os.path.dirname(mymodule.__file__)

のように書くことができます。

+3

__私のWindowsでは '__file__'が返されるので、確信できません。exeプログラム: 'C:¥Program Files(x86)¥myprogram¥myprogram.exe¥core.pyc'。そうすれば、OSX、Linux、またはターミナルから実行しているときでさえも、返されたパス( 'core.pyc'と' myprogram.exe')の2つのレベルを取り除く必要があります。 – Rabarberski

+1

次に、最高の解決策は@SpencerRathbunによって設定ファイルの言及です – Nilesh

1

は、私は頻繁にこれを使用する:それはディレクトリだから、あなたのスクリプトを実行する開発環境と一致ランタイムを作る

os.chdir(sys.argv[0].rsplit(os.sep, 1)[0]) 

。私のQtとプログラムを.exeファイルにコンパイルで

+0

意味があります。 'rsplit'の代わりに' os.path.dirname(sys.argv [0]) 'を使わないのはなぜですか? 'dirname'アプローチは、私自身より文書化されているようですが、おそらく特別な(クロスプラットフォームの)ケースがいくつかあります。 – Rabarberski

3

、私はあなたに非常によく似たコード使用しています:パスは、非ASCII記号が含まれている可能性があるので、私はユニコードを使用してい

def executable_path(): 
    self_file = unicode(sys.argv[0], sys.getfilesystemencoding()) 
    return os.path.realpath(os.path.dirname(self_file)) 

を。

sys.argvの[0]これはフルパス名か

os.path.realpathその問題を解決しているかどうかに依存するオペレーティングシステムです。

3

configファイルにプラグインディレクトリへのパスがないのはなぜですか?これにより、ユーザーは移動することができます。また、各osごとに1つずつ移動できます。実行ファイル、あるいはよく使う場所、Linux上では〜や/ etc、Windowsでは%homepath%を使ってください。

+0

はい、将来の機能としてこれを計画しています。しかし、その間に、(実行ファイルに対して)単一の場所を正しく動作させるという、より基本的な解決策が必要になります。提案していただきありがとうございます! – Rabarberski

+1

。 Windows下のプラグインはおそらく%APPDATA%に終わるはずです... –

+1

@Rabarberskiもし簡単な解決策が必要なら、プラグインをexeと同じフォルダに置くのはどうですか? –

関連する問題