2013-10-28 15 views
10

"scripts"ディレクトリに存在する実行可能なpythonスクリプトがあります。このスクリプトへのシンボリックリンク(ファイルの起動に使用)がルートディレクトリにあります。ルートディレクトリからシンボリックリンクを介してPythonスクリプトを起動

python build_i 

:私は経由して私のスクリプトを実行/起動できるようにしたいと思い

. 
├── scripts 
│ ├── const.py 
│ ├── fops.py 
│ ├── i_build.py 
│ └── i_Props.ini 
└── build_i -> scripts/i_build.py 

:ような何か。 i_build.pyスクリプトはi_Props.iniを開き、そこにあるものに基づいていくつかの魔法を試みます。

i_build.pyスクリプトがルートディレクトリのシンボリックリンクを介して起動されると、i_build.pyスクリプトはルートディレクトリ内の他のファイルを探します(i_build.pyは/ scriptsディレクトリではありません)。保存される)。

i_build.pyファイルとして小道具ファイルの場所があります

PROP_FILE = "i_Props.ini" 

及びそれを開くために試み、その後失敗。私は明白な理由のためにパスをハードコードしたくありません。

メインファイルにos.getcwd()を追加したクイックテストでは、CWDがルートディレクトリであると考えていることが確認され、__file__のチェックではシンボリックリンク( "build_i")と表示されます。

__file__の名前とCWDのようなシンボリックの宛先をPythonで使用するためにできることはありますか?

+0

他のオペレーティングシステムで使用しているkqueue /を使用してファイルシステムを監視できます。最終的に2つの場所を離れて設定するものは、実行を開始するinodeです。しかし、私が考えることができる唯一の他のものは、ソフトリンクではなくハードリンクであると思うが、それは全く反対の効果があるかもしれないと思っている。私はZ shellにあなたの本物のcwdをargとしてスクリプトに与えることができるプログラムフックを実行する前にそれを持っていると信じています。 – synthesizerpatel

+0

これは答えに値しないので、コメントしています。あなたは 'os.readlink()'を使ってシンボリックリンクを読んで、結果から 'subprocess.Popen()'でスクリプトを実行することができます。ちょっとやっかいですが、何もハードコードされておらず、依存関係は追加されません。 – ThinkChaos

+0

related:[現在実行されているファイルのパスをPythonでどのように取得するのですか?](http://stackoverflow.com/q/2632199/4279) – jfs

答えて

1

ただ、いくつかの可能性を念頭に春:ルートディレクトリに

  1. は、明示的なパスで、あなたのpythonの スクリプトを呼び出すシェルファイルを持っています。
  2. あなたのパスに存在するディレクトリを追加します。
  3. 具体的にあなたが__file__を使用することができます
+0

オプション1は私の回避策です... 2と3は本質的にまだハードコーディング。私はこれが多くの人に配布されるので、余分なステップを含む何も避ける必要があります。 – Mike

+0

Linuxの場合、/ etcまたは/ binや/ usr/etcにbashスクリプトを追加すると、パスを与えることなく実行可能になります。 –

13

をのsys.pathにディレクトリを追加しますが、実際のパスを取得するには、いくつかの予防措置を取らなければならない:

import os 
base_dir = os.path.dirname(os.path.realpath(__file__)) 

次に相対あなたの他のファイル/リソースを読み込みますto base_dir:

some_subdir = 'my_subdir' 
some_file = 'my.ini' 

ini_path = os.path.join(base_dir, some_subdir, some_file) 
+1

['__file__'は未定義です](http://stackoverflow.com/q/2632199/4279)この場合、' sys.argv [0] 'に置き換えることができます(https://bitbucket.org/ pypy/pypy/src/a299cd0a893f/pypy/tool/autopath.py?at =デフォルト#cl-29) – jfs

関連する問題