从子目录导入文件?
- 2024-12-24 08:56:00
- admin 原创
- 151
问题描述:
我有一个名为 的文件tester.py
,位于/project
。
/project
有一个名为的子目录lib
,其中有一个名为的文件BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
我想BoxTime
从导入tester
。我尝试过以下方法:
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()
解决方案 1:
查看软件包文档(第 6.4 节)。
简而言之,你需要将一个名为
__init__.py
在lib
目录中。
解决方案 2:
创建名为 的子目录
lib
。创建一个名为 的空文件
lib__init__.py
。在 中编写如下
libBoxTime.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!
解决方案 3:
您可以尝试将其插入sys.path
:
sys.path.insert(0, './lib')
import BoxTime
解决方案 4:
我写下这个是因为似乎每个人都建议你必须创建一个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)
解决方案 5:
尝试一下。有关更多信息,请阅读PEP 328import .lib.BoxTime
中的相对导入。
解决方案 6:
你的 lib 目录是否包含__init__.py
文件?
Python 用于__init__.py
确定目录是否为模块。
解决方案 7:
包含完整示例
这基本上涵盖了所有情况(确保您有__init__.py
相对/路径/到/您的/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()
解决方案 8:
在子目录 /lib 中创建一个空文件 __init__.py
。并在主代码开头添加
from __future__ import absolute_import
然后
import lib.BoxTime as BT
...
BT.bt_function()
或更好
from lib.BoxTime import bt_function
...
bt_function()
解决方案 9:
只是对这些答案的补充。
如果您想从所有子目录导入所有文件,您可以将其添加到文件的根目录。
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
换句话说,这段代码将抽象出文件来自哪个目录。
解决方案 10:
对于此文件夹层次结构图示例:
/project/tester.py
/project/lib/BoxTime.py
__init__.py
1-在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)。
解决方案 11:
创建卡片.py
init():
print('Hello world!')
应用程序
import create_card
create_card.init()
如果你只想导入所需的功能
from create_card import init
如果您有嵌套目录(例如:modules/aadhaar/create-card.py)
import modules.aadhaar.create_card as create_card
或者from modules.aadhaar.create_card import init
解决方案 12:
/project/tester.py
/project/lib/BoxTime.py
创建空白文件__init__.py
,直到到达文件
/project/lib/somefolder/BoxTime.py
#lib
-- 需要有两个项目__init__.py
,一个是名为 somefolder 的目录,#somefolder
其中包含两个项目boxtime.py
,并且__init__.py
解决方案 13:
试试这个:
from lib import BoxTime