从子目录导入文件?

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...

问题描述:

我有一个名为 的文件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是问题所在,但不要忘记将其称为BoxTimelib.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__.py1-在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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用