从子目录导入文件?

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

# EYZ0试试。要了解更多信息,请阅读PEP 328中有关相对导入的内容。

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

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

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

    def foo():
    print "foo!"
    
  • In your client code in the directory above lib, write:

    from lib import BoxTime
    BoxTime.foo()
    
  • Run your client code. You will get:

    foo!
    

Much later -- in linux, it would look like this:

% 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:

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

试试这个:

# EYZ0

包括完整的示例

这基本上涵盖了所有的情况(确保你有__init__.py相对/path/到/your/lib/文件夹):

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()
在/lib子目录下创建一个空文件__init__.py。 并在主代码的开头添加

from __future__ import absolute_import

然后

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

或更好的

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

# EYZ0

# EYZ0

在一行中创建空白文件__init__.py,直到到达该文件

# EYZ0

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

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

您不需要将子目录命名为lib。你可以把它命名为anything,前提是你把__init__.py放进去。

你可以在linux shell中输入以下命令:

$ touch anything/__init__.py

现在你有了这个结构:

$ ls anything/
__init__.py
mylib.py


$ ls
main.py

然后你可以像这样导入mylibmain.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

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

对于这个文件夹层次图示例:

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

1-在自由文件夹内创建一个空白的py文件__init__.py

在调用者的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笔记本创建模块,它不工作(可能我不正确地使用。ipynb),我需要在juypyter笔记本外手动完成,或使用其他IDE(例如pycharm)。

create_card.py

 init():
print('Hello world!')

app.py

import create_card


create_card.init()

如果您只想导入所需的函数

from create_card import init

如果你有嵌套目录(例如:modules/aadhaar/create-card.py)

import modules.aadhaar.create_card as create_cardfrom modules.aadhaar.create_card import init