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

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

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

我想从测试器导入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 ?

EDIT

__init__.py是问题所在,但不要忘记将BoxTime引用为lib。BoxTime,或使用:

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

当前回答

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

from __future__ import absolute_import 

then

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

或更好的

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

其他回答

查看Packages文档(第6.4节)。

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

__init__.py

在lib目录中。

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

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

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

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

您不需要将子目录命名为lib。你可以给它起任何名字,只要你在里面放了__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)

只是对这些答案的补充。

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

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

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