从子目录导入文件?

时间:2009-08-11 14:39:05

标签: python module subdirectory python-import

我有一个名为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()

11 个答案:

答案 0 :(得分:462)

在这里查看Packages文档(第6.4节):http://docs.python.org/tutorial/modules.html

简而言之,您需要放置一个名为

的空白文件
__init__.py
在“lib”目录中。

答案 1 :(得分:138)

  • 创建名为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!

答案 2 :(得分:53)

您可以尝试将其插入sys.path

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

答案 3 :(得分:19)

您的lib目录是否包含__init__.py文件?

Python使用__init__.py来确定目录是否是模块。

答案 4 :(得分:14)

试试import .lib.BoxTime。有关更多信息,请参阅PEP 328中的相对导入。

答案 5 :(得分:14)

我将其写下来是因为每个人似乎都建议您必须创建一个lib目录。

您无需命名子目录lib。只要将anything放入其中,就可以命名为__init__.py

您可以通过在linux shell中输入以下命令来做到这一点:

$ 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)

答案 6 :(得分:7)

我这样做基本上涵盖了所有情况(确保你在相对/ path / to / your / lib /文件夹中有__init__.py):

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 :(得分:3)

在子目录/ lib中创建一个空文件__init__.py。 并在主代码的开头添加

from __future__ import absolute_import 

然后

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

或更好

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

答案 8 :(得分:3)

只是这些答案的补充。

如果要从所有子目录导入所有文件,可以将其添加到文件的根目录。

import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])

然后您可以简单地从子目录中导入文件,就像这些文件位于当前目录中一样。

工作示例

如果我的项目中具有以下目录及其子目录...

.
├── a.py
├── b.py
├── c.py
├── subdirectory_a
│   ├── d.py
│   └── e.py
├── subdirectory_b
│   └── f.py
├── subdirectory_c
│   └── g.py
└── subdirectory_d
    └── h.py

我可以将以下代码放入a.py文件中

import sys, os
sys.path.extend([f'./{name}' for name in os.listdir(".") if os.path.isdir(name)])

# And then you can import files just as if these files are inside the current directory

import b
import c
import d
import e
import f
import g
import h

换句话说,这段代码将抽象出文件来自哪个目录。

答案 9 :(得分:0)

试试这个:

from lib import BoxTime

答案 10 :(得分:-1)

/project/tester.py

/project/lib/BoxTime.py

在线下创建空白文件__init__.py,直至到达文件

/project/lib/somefolder/BoxTime.py

#lib - needs有两个项目__init__.py和一个名为somefolder的目录 #somefolder有两项boxtime.py__init__.py