从子目录导入文件?
我有一个名为 tester.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
吗?
编辑
__init__.py
是问题所在,但不要忘记将 BoxTime
引用为 lib.BoxTime
,或使用:
import lib.BoxTime as BT
...
BT.bt_function()
I have a file called tester.py
, located on /project
.
/project
has a subdirectory called lib
, with a file called BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
I want to import BoxTime
from tester
. I have tried this:
import lib.BoxTime
Which resulted:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Any ideas how to import BoxTime
from the subdirectory?
EDIT
The __init__.py
was the problem, but don't forget to refer to BoxTime
as lib.BoxTime
, or use:
import lib.BoxTime as BT
...
BT.bt_function()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
查看包文档(第 6.4 节)< /强>。
简而言之,您需要
在
lib
目录中放置一个名为的空白文件。Take a look at the Packages documentation (Section 6.4).
In short, you need to put a blank file named
in the
lib
directory.lib
的子目录。lib\__init__.py
的空文件。在
lib\BoxTime.py
中,编写一个函数foo()
,如下所示:在上面目录中的客户端代码中 <代码>lib,写入:
运行客户端代码。 您将得到:
<前><代码>富!
很久以后——在 Linux 中,它看起来像这样:
lib
.lib\__init__.py
.In
lib\BoxTime.py
, write a functionfoo()
like this:In your client code in the directory above
lib
, write:Run your client code. You will get:
Much later -- in linux, it would look like this:
您可以尝试将其插入到
sys.path
中:You can try inserting it in
sys.path
:我写下这些是因为每个人似乎都建议您必须创建一个
lib
目录。您不需要将子目录命名为
lib
。 只要将__init__.py
放入其中,您就可以将其命名为任何
。您可以通过在 linux shell 中输入以下命令来做到这一点:
现在您有了这样的结构:
然后您可以将
mylib
导入到main.py
中,如下所示:您还可以像这样导入函数和类:
您放置在 __init__.py 中的任何变量函数或类也可以被访问:
或者像这样:
I am writing this down because everyone seems to suggest that you have to create a
lib
directory.You don't need to name your sub-directory
lib
. You can name itanything
provided you put an__init__.py
into it.You can do that by entering the following command in a linux shell:
So now you have this structure:
Then you can import
mylib
intomain.py
like this:You can also import functions and classes like this:
Any variable function or class you place inside
__init__.py
can also be accessed:Or like this:
包含完整示例
这基本上涵盖了所有情况(确保您在relative/path/to/your/lib/folder中有
__init__.py
):示例:< /strong>
您的项目文件夹中有:
您的另一个项目文件夹中有:
您想要使用
/root/anotherproject/utils.py
并调用其中的 foo 函数。所以你在app.py中写:
Full example included
This basically covers all cases (make sure you have
__init__.py
in relative/path/to/your/lib/folder):Example:
You have in your project folder:
You have in another project folder:
You want to use
/root/anotherproject/utils.py
and call foo function which is in it.So you write in app.py:
您的 lib 目录是否包含 __init__.py 文件?
Python 使用 __init__.py 来确定目录是否是模块。
Does your lib directory contain a
__init__.py
file?Python uses
__init__.py
to determine if a directory is a module.尝试
导入.lib.BoxTime
。 有关相对导入的更多信息,请阅读 PEP 328 。Try
import .lib.BoxTime
. For more information read about relative import in PEP 328.在子目录/lib 中创建一个空文件
__init__.py
。在主代码的开头添加
然后
或者更好
Create an empty file
__init__.py
in subdirectory /lib.And add at the begin of main code
then
or better
只是对这些答案的补充。
如果您想导入所有子目录中的所有文件,您可以将其添加到文件的根目录中。
然后您可以简单地从子目录导入文件,就像这些文件位于当前目录中一样。
工作示例
如果我的项目中有以下带有子目录的目录...
我可以将以下代码放入我的
a.py
文件中换句话说,此代码将从文件所在的目录中抽象出来从。
Just an addition to these answers.
If you want to import all files from all subdirectories, you can add this to the root of your file.
And then you can simply import files from the subdirectories just as if these files are inside the current directory.
Working example
If I have the following directory with subdirectories in my project...
I can put the following code inside my
a.py
fileIn other words, this code will abstract from which directory the file is coming from.
对于此文件夹层次结构图示例:
1- 在 lib 文件夹内创建一个空白 py 文件
__init__.py
2- 在调用方 py 文件 tester.py 中添加这些代码行
简单解释可以在此处找到。
注意:这称为在不同文件夹中创建/导入模块。
个人经验:我尝试从jupyter笔记本创建模块,但它不起作用(也许我使用.ipynb做得不正确),我需要在juypyter笔记本之外手动创建模块,或者使用其他IDE(例如pycharm)。
For this folder hierarchy diagram example:
1- Create a blank py file
__init__.py
inside lib folder2- In the caller py file tester.py add theses code lines
Easy explanation can be found in here.
Notice: This is refered to as creating/importing modules in/from different folder.
Personel experience: I tried to create module from jupyter notebook, it did not not work (maybe I done it improperly using .ipynb), I needed to do it manually outside the juypyter notebook, or using other IDE (e.g. pycharm).
create_card.py
app.py
如果您只想导入必需的函数
如果您有嵌套目录(例如:modules/aadhaar/create-card.py)
import module.aadhaar.create_card as create_card
或从modules.aadhaar.create_card导入init
create_card.py
app.py
if you want to import only required functions
If you have nested directories (Ex: modules/aadhaar/create-card.py)
import modules.aadhaar.create_card as create_card
orfrom modules.aadhaar.create_card import init
/project/tester.py
/project/lib/BoxTime.py
创建空白文件
__init__.py
直到到达文件< code>/project/lib/somefolder/BoxTime.py
#lib
-- 需要有两项,一个是__init__.py
和一个名为 somefolder 的目录#somefolder
有两个项目boxtime.py
和__init__.py
/project/tester.py
/project/lib/BoxTime.py
create blank file
__init__.py
down the line till you reach the file/project/lib/somefolder/BoxTime.py
#lib
-- needs has two items one__init__.py
and a directory named somefolder#somefolder
has two itemsboxtime.py
and__init__.py
试试这个:
from lib import BoxTime
try this:
from lib import BoxTime