关于python:从子目录导入文件?

Import a file from a subdirectory?

我有一个叫tester.py的文件,位于/project上。

/project有一个名为lib的子目录,其中有一个名为BoxTime.py的文件:

1
2
/project/tester.py
/project/lib/BoxTime.py

我想从tester进口BoxTime。我尝试过:

1
import lib.BoxTime

结果:

1
2
3
4
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或使用:

1
2
3
import lib.BoxTime as BT
...
BT.bt_function()

查看包文档(第6.4节):http://docs.python.org/tutorial/modules.html

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

1
__init__.py

在"lib"目录中。


  • 创建名为lib的子目录。
  • 创建一个名为lib\__init__.py的空文件。
  • lib\BoxTime.py中,编写一个函数foo()如下:

    1
    2
    def foo():
        print"foo!"
  • 在您的客户机代码中,在lib上方的目录中,写下:

    1
    2
    from lib import BoxTime
    BoxTime.foo()
  • 运行客户端代码。你会得到:

    1
    foo!

很晚——在Linux中,它看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
% 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中插入:

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


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

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


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


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

您不需要将子目录命名为lib。你可以把它命名为anything,只要你在里面放一个__init__.py

您可以通过在Linux shell中输入以下命令来完成此操作:

1
$ touch anything/__init__.py

现在你有了这样的结构:

1
2
3
4
5
6
$ ls anything/
__init__.py
mylib.py

$ ls
main.py

然后您可以将mylib导入main.py,如下所示:

1
2
3
from anything import mylib

mylib.myfun()

您还可以导入如下函数和类:

1
2
3
4
5
from anything.mylib import MyClass
from anything.mylib import myfun

instance = MyClass()
result = myfun()

您放置在__init__.py中的任何变量函数或类也可以访问:

1
2
3
import anything

print(anything.myvar)

或者像这样:

1
2
3
from anything import myvar

print(myvar)


我这样做基本上涵盖了所有情况(确保在relative/path/to/your/lib/folder中有EDOCX1[1]):

1
2
3
4
5
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) +"/relative/path/to/your/lib/folder")
import someFileNameWhichIsInTheFolder
...
somefile.foo()

例子:您的项目文件夹中有:

1
/root/myproject/app.py

您在另一个项目文件夹中:

1
2
/root/anotherproject/utils.py
/root/anotherproject/__init__.py

您要使用/root/anotherproject/utils.py并调用其中的foo函数。

所以你在app.py中写道:

1
2
3
4
5
import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) +"/../anotherproject")
import utils

utils.foo()


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

1
from __future__ import absolute_import

然后

1
2
3
import lib.BoxTime as BT
...
BT.bt_function()

或更好

1
2
3
from lib.BoxTime import bt_function
...
bt_function()

试试这个:

from lib import BoxTime


/project/tester.py

/project/lib/BoxTime.py

沿行创建空白文件__init__.py,直到到达该文件为止。

/project/lib/somefolder/BoxTime.py

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