tester.py
にある/project
というファイルがあります。
/project
には、lib
という名前のサブディレクトリと、BoxTime.py
という名前のファイルがあります。
/project/tester.py
/project/lib/BoxTime.py
BoxTime
からtester
をインポートしたいです。私はこれを試しました:
import lib.BoxTime
その結果、
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
サブディレクトリからBoxTime
をインポートする方法はありますか?
_編集_
__init__.py
が問題でしたが、BoxTime
をlib.BoxTime
として参照すること、または次のように使用することを忘れないでください。
import lib.BoxTime as BT
...
BT.bt_function()
ここでパッケージのドキュメント(6.4節)をご覧ください。 http://docs.python.org/tutorial/modules.html
要するに、あなたは名前の空のファイルを置く必要があります
__init__.py
"lib"ディレクトリにあります。
lib
という名前のサブディレクトリを作成します。lib\__init__.py
という名前の空のファイルを作成します。lib\BoxTime.py
に、次のように関数foo()
を書きます。
def foo():
print "foo!"
lib
の上のディレクトリにあるクライアントコードに、次のように書いてください。
from lib import BoxTime
BoxTime.foo()
クライアントコードを実行してください。あなたは得るでしょう:
foo!
ずっと後になって - linuxでは、このように見えるでしょう:
% cd ~/tmp
% mkdir lib
% touch lib/__init__.py
% cat > lib/BoxTime.py << EOF
heredoc> def foo():
heredoc> print "foo!"
heredoc> EOF
% tree lib
lib
├── BoxTime.py
└── __init__.py
0 directories, 2 files
% python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lib import BoxTime
>>> BoxTime.foo()
foo!
sys.path
に挿入してみてください。
sys.path.insert(0, './lib')
import BoxTime
あなたのlibディレクトリは__init__.py
ファイルを含んでいますか?
Pythonは__init__.py
を使ってディレクトリがモジュールかどうかを判断します。
import .lib.BoxTime
を試してください。より詳しい情報は PEP 328 にある相対インポートについて読んでください。
誰もがあなたがlib
ディレクトリを作成しなければならないと提案するように思われるので私はこれを書き留めています。
あなたのサブディレクトリにlib
という名前を付ける必要はありません。 __init__.py
を入れれば、anything
と名付けることができます。
これを行うには、Linuxシェルで次のコマンドを入力します。
$ touch anything/__init__.py
だから今、あなたはこの構造を持っています:
$ ls anything/
__init__.py
mylib.py
$ ls
main.py
それならmylib
をmain.py
にインポートすることができます。
from anything import mylib
mylib.myfun()
このように関数やクラスをインポートすることもできます。
from anything.mylib import MyClass
from anything.mylib import myfun
instance = MyClass()
result = myfun()
__init__.py
内に配置した変数関数やクラスにもアクセスできます。
import anything
print(anything.myvar)
またはこのように:
from anything import myvar
print(myvar)
私はこれを行いますが、これは基本的にすべてのケースをカバーしています(__init__.py
が/ relative/path/to/your/lib /フォルダーにあることを確認してください)。
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()
例:
あなたはあなたのプロジェクトフォルダにいます:
/root/myproject/app.py
他のプロジェクトフォルダにあります。
/root/anotherproject/utils.py
/root/anotherproject/__init__.py
/root/anotherproject/utils.py
を使い、その中にあるfoo関数を呼び出したいとします。
それであなたはapp.pyで書く:
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../anotherproject")
import utils
utils.foo()
サブディレクトリ/ libに空のファイル__init__.py
を作成します。メインコードの先頭に追加
from __future__ import absolute_import
それから
import lib.BoxTime as BT
...
BT.bt_function()
以上
from lib.BoxTime import bt_function
...
bt_function()
これを試して:
from lib import BoxTime