561

我有一个名为 的文件tester.py,位于/project.

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

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

我想BoxTimetester. 我试过这个:

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是问题所在,但不要忘记引用BoxTimeaslib.BoxTime或使用:

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

12 回答 12

635

查看Packages 文档(第 6.4 节)

简而言之,你需要把一个空白文件命名为

__init__.py

lib目录中。

于 2009-08-11T14:42:10.267 回答
201
  • 创建一个名为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!
于 2009-08-11T14:46:34.517 回答
87

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

sys.path.insert(0, './lib')
import BoxTime
于 2013-02-21T09:47:42.243 回答
43

我写下来是因为每个人似乎都建议您必须创建一个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)
于 2018-10-03T14:11:35.887 回答
23

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

于 2009-08-11T14:42:13.027 回答
20

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

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

于 2009-08-11T14:44:44.893 回答
16

包含完整示例

这基本上涵盖了所有情况(确保你有__init__.pyrelative/path/to/your/lib/folder):

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()
于 2016-02-08T14:32:09.990 回答
7

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

from __future__ import absolute_import 

然后

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

或更好

from lib.BoxTime import bt_function
...
bt_function()
于 2018-01-28T20:58:28.237 回答
6

只是对这些答案的补充。

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

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

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

于 2020-04-19T21:00:14.463 回答
0

对于此文件夹层次结构图示例:

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

__init__.py1-在lib文件夹中创建一个空白 py 文件

2- 在调用者 py 文件 tester.py 添加这些代码行

import os, sys
sys.path.insert(0,'lib')# insert the folder lib in system path
from BoxTime import Function_name # from the py file import the needed function

可以在这里找到简单的解释。

注意:这被称为在/从不同的文件夹中创建/导入模块。

个人经验:我尝试从 jupyter notebook 创建模块,但没有成功(可能我使用 .ipynb 做得不正确),我需要在 juypyter notebook 之外手动完成,或者使用其他 IDE(例如 pycharm)。

于 2022-02-08T06:09:47.110 回答
-1

/project/tester.py

/project/lib/BoxTime.py

创建空白文件__init__.py直到你到达文件

/project/lib/somefolder/BoxTime.py

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

于 2018-03-16T20:20:28.193 回答
-3

试试这个:

from lib import BoxTime

于 2015-09-28T20:53:28.127 回答