2016-06-16 11 views
0

/foo/bar.pyにあるスクリプトsubprocessモジュールを使用して2番目のスクリプト/main.pyを実行しようとしました。 bar.pyを実行し、Windowsのコマンドプロンプトでpython main.pymain.py実行罰金がmain.pyがなぜ今settings.iniへのパスに問題があるエラー別のPythonスクリプトによって実行されるPythonスクリプトでパスが変更された

ConfigParser.NoSectionError: No section: 'user' 

を起こし呼び出し、我々はそれをどのように修正することができましたか?

〜/ settings.ini

[user] 
id: helloworld 

〜/ fooの/ bar.py

subprocess.Popen([sys.executable, "../main.py"]) 

〜/ main.py

Config = ConfigParser.ConfigParser() 
Config.read("settings.ini") 
userId = Config.get('user', 'id') 
+0

を参照してください、現在のディレクトリがそれぞれのケースで同じですか?ファイル名 'settings.ini'はディレクトリ名で修飾されていないので、2つの異なるファイルをピックアップするかもしれないので私は尋ねます。 – cdarke

+0

モジュールをインポートし、その関数、クラスを直接サブプロセスとして実行するのではなく、直接使用する方が柔軟性があります。 [サブプロセスを使ったpythonスクリプトでの入力でPythonスクリプトを呼び出す]を参照してください(http://stackoverflow.com/q/30076185/4279) – jfs

答えて

1

の場合はmain.pyと同じディレクトリにあるとみなされ、フルパスを__file__から推測し、フルパスを使用して設定を読み取ることができます。

main.pyread()方法は、非空のリストを返すこと

import os 
ini_path = os.path.join(os.path.dirname(__file__), "settings.ini") 
Config = ConfigParser.ConfigParser() 
Config.read(ini_path) 
0

チェックは、それ以外の場合はsettings.iniが見つからないことを意味します。相対パスは、スクリプトのディレクトリではなく、bar.pyが格納されているディレクトリではなく、現在の作業ディレクトリ(pythonを実行した場所)を基準に解決されます。

おそらくappdirs.user_config_dir()を使用して、ユーザーの構成ファイルを置くディレクトリを取得する必要があります。 Windows、macOS、Linuxディストリビューションなどの異なるOSでは、異なるデフォルトを使用することがあります。 appdirsは、特定のOSに適した規則に従います。

インストールされたPythonモジュールでパッケージ化されたファイルにデータを格納する場合は、pkgutil.get_data()またはsetuptoolsのpkg_resources.resource_string()work even if your package is inside an archiveとすることができます。手動でパスを構築することは推奨されませんが、現在のスクリプトでディレクトリが必要な場合はput get_script_dir() function into your script -itがos.path.dirname(os.path.abspath(__file__))より一般的です。相対位置が常に同じであるなら、あなたは使用することができます:

#!/usr/bin/env python 
import os 
import subprocess 
import sys 

main_script_dir = os.path.join(get_script_dir(), os.pardir) 
subprocess.check_call([sys.executable, '-m', 'main'], cwd=main_script_dir) 

Python : How to access file from different directory

関連する問題