[英]Import a file from a subdirectory?
我有一个名为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()
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!
您可以尝试将其插入sys.path
:
sys.path.insert(0, './lib')
import BoxTime
我写下这个是因为每个人似乎都建议您必须创建一个lib
目录。
您不需要命名您的子目录lib
。 只要将__init__.py
放入其中,您就可以将其命名为anything
名称。
您可以通过在 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)
您的 lib 目录是否包含__init__.py
文件?
Python 使用__init__.py
来确定一个目录是否是一个模块。
尝试import .lib.BoxTime
。 有关更多信息,请阅读PEP 328 中的相对导入。
包括完整示例
这基本上涵盖了所有情况(确保您在 relative/path/to/your/lib/folder 中有__init__.py
):
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()
只是对这些答案的补充。
如果要从所有子目录导入所有文件,可以将其添加到文件的根目录中。
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- 在lib文件夹中创建一个空白 py 文件__init__.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)。
create_card.py
init():
print('Hello world!')
应用程序.py
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
/project/tester.py
/project/lib/BoxTime.py
创建空白文件__init__.py
直到你到达文件
/project/lib/somefolder/BoxTime.py
#lib
-- 需要两个项目一个__init__.py
和一个名为 somefolder 的目录#somefolder
有两个项目boxtime.py
和__init__.py
试试这个:
from lib import BoxTime
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.