2016-11-11 5 views
0

私は、ファイル/parameters.xmlをロードするPython3スクリプトを持っています。このスクリプトは、PyInstallerを備えたアプリに組み込まれています。 OS XのFinderからアプリを起動する場合はMac OS XのコマンドラインはPython Mac OS Xがアプリケーションのときに外部XMLファイルにロードされない

それはない - エクスプローラ
でWindowsをダブルクリック - Windowsコマンドライン
-
:罰金以下の方法、スクリプトとアプリの仕事を起動しますXMLファイルを見つけることができます。ファイルは常にアプリの場所からロードされるように、私はそれを作ることができる方法

try: 
    self.paramTree = ET.parse("../parameters/parameters.xml") 
except: 
    self.paramTree = ET.parse("parameters/parameters.xml") 
self.paramRoot = self.paramTree.getroot() 

コードは、ファイルを呼び出すこと切り取ら?

答えて

0

ファイルには、相対パスでアクセスします。あなたの最後のケース(OS X Finder)では、現在の作業ディレクトリが同じ方法で設定されていないように見えます。これにより、ファイルが見つからなくなります。

あなたはので、あなたのプログラムの位置に基づいて作業ディレクトリを設定することができます。

import os 

# __file__ is a relative path to the program file (relative to the current 
# working directory of the Python interpreter). 
# Therefore, dirname() can yield an empty string, 
# hence the need for os.path.abspath before os.chdir() is used: 
prog_dir = os.path.abspath(os.path.dirname(__file__)) 
os.chdir(prog_dir) # Sets the current directory 

あなたは多分(スクリプトが期待するものに応じて、これとは少し違うものに現在の作業ディレクトリを設定することもできますスクリプトの親ディレクトリ:os.path.join(prog_dir, os.pardir))。

tryを実行する必要がなくなるはずです。スクリプトは現在の作業ディレクトリに対する相対パスを使用するため、現在のディレクトリを最初に設定する必要があります。

+0

__file__はpython 3でファイル名を与えるだけで、関数os.path.abspathを追加することで修正されました。 –

+0

'abspath()'が実際に使われるはずです(私は答えを修正しました)。しかし、 '__file__'はプログラムの_path(名前ではありません)、_現在の作業ディレクトリ_の_(これはプログラムファイル名だけを与えると考えるかもしれません。参照:https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy、セクション「モジュール」 – EOL

関連する問題