web-dev-qa-db-ja.com

サブディレクトリからファイルをインポートしますか?

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が問題でしたが、BoxTimelib.BoxTimeとして参照すること、または次のように使用することを忘れないでください。

import lib.BoxTime as BT
...
BT.bt_function()
371
Adam Matan

ここでパッケージのドキュメント(6.4節)をご覧ください。 http://docs.python.org/tutorial/modules.html

要するに、あなたは名前の空のファイルを置く必要があります

__init__.py

"lib"ディレクトリにあります。

458
Greg
  • 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!
137
hughdbrown

sys.pathに挿入してみてください。

sys.path.insert(0, './lib')
import BoxTime
52
Kresimir

あなたのlibディレクトリは__init__.pyファイルを含んでいますか?

Pythonは__init__.pyを使ってディレクトリがモジュールかどうかを判断します。

19
Wade

import .lib.BoxTimeを試してください。より詳しい情報は PEP 328 にある相対インポートについて読んでください。

14
drrlvn

誰もがあなたがlibディレクトリを作成しなければならないと提案するように思われるので私はこれを書き留めています。

あなたのサブディレクトリにlibという名前を付ける必要はありません。 __init__.pyを入れれば、anythingと名付けることができます。

これを行うには、Linuxシェルで次のコマンドを入力します。

$ touch anything/__init__.py 

だから今、あなたはこの構造を持っています:

$ ls anything/
__init__.py
mylib.py

$ ls
main.py

それならmylibmain.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)
13
nurettin

私はこれを行いますが、これは基本的にすべてのケースをカバーしています(__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()
7
Mercury

サブディレクトリ/ libに空のファイル__init__.pyを作成します。メインコードの先頭に追加

from __future__ import absolute_import 

それから

import lib.BoxTime as BT
...
BT.bt_function()

以上

from lib.BoxTime import bt_function
...
bt_function()
3
Mik

これを試して:

from lib import BoxTime

0
Orane