从子目录导入文件?

659 投票
13 回答
793134 浏览
提问于 2025-04-15 13:31

我有一个文件叫做 tester.py,它在 /project 这个文件夹里。

/project 里面有一个子文件夹叫 lib,里面有一个文件叫 BoxTime.py

/project/tester.py
/project/lib/BoxTime.py

我想从 tester 文件中导入 BoxTime。我试过这样做:

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

13 个回答

106

你可以试着把它放到 sys.path 里:

sys.path.insert(0, './lib')
import BoxTime
224
  • 创建一个名为 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!
697

看看这个关于包的文档(第6.4节)

简单来说,你需要在

__init__.py

这个位置放一个空文件,文件名就是上面提到的。

这个文件要放在lib文件夹里。

撰写回答