os.chdir()を使用してスクリプトからパッケージディレクトリにアクセスすると、名前空間のインポートが機能しないのはなぜですか?
たとえば、これが問題を示すための私のパッケージ構造です。
testpk/
testpk/bin
testpk/bin/runit.py
testpk/lib
testpk/lib/libcode.py
testpk/lib/__init__.py
これがインポートされたiveを出力する私のlibコードです
print "I've been imported"
runit.pyの内容
#!/usr/bin/python
import sys, os
if __name__ == "__main__":
os.chdir('/home/moorepe/src/testpk')
print "working path = " , os.getcwd()
import lib.libcode
runitを実行すると、次のエラーが発生します。
moorepe@halifax$ bin/runit.py
Traceback (most recent call last):
File "bin/runit.py", line 6, in <module>
import lib.libcode
ImportError: No module named lib.libcode
ただし、Pythonコマンドラインでこれをテストすると、期待どおりに機能します。
cd testpk
python -c "import lib.libcode
I've been imported
そして、これはbindirから機能します。
cd testpk/bin
python -c "import os; os.chdir('/home/moorepe/src/testpk') ; import lib.libcode"
I've been imported
誰かが何が悪いのか説明できますか?
したがって、これが機能しなかった理由は、PythonがPYTHONPATHに加えて現在のdirをパスとして使用するためです。
したがって、このコードはsys.path.append( "。")を追加することで機能します。これは、現在の作業ディレクトリをパスの追加として強制するためです。