当前位置: 首页 > 知识库问答 >
问题:

从相对目录迭代导入Python脚本

公羊向荣
2023-03-14

我有一个名为test.py的脚本,代码如下(我已经大大简化了事情):

from foo import Bar

bar = Bar()
result = bar.do_something()

但我不仅仅有一个名为foo的脚本。我有许多名为foo的脚本,按以下目录结构组织:

└── project
    ├── code
    │   ├── test.py
    └── scripts
        ├── script_1
            └── foo.py
        ├── script_2
            └── foo.py
        ├── script_3
            └── foo.py
        ├── script_4
            └── foo.py
        ├── script_5
            └── foo.py

每个foo.py都有一个稍微不同的实现。我想对test.py做的是通过导入每个脚本并对其运行一些测试来测试所有脚本。下面是一些代码(*'s表示伪代码)

*Get all script directories*
*For each directory in script directories:*
    *import foo.py from this directory*

    bar = Bar()
    result = bar.do_something()

    *Save the result for this directory*

我该怎么做?特别是,如何迭代导入脚本,例如,*导入foo。是否从此目录中复制*

共有2个答案

连厉刚
2023-03-14

我不得不做几件不同的事情,但结果代码片段如下所示:

import os, sys, importlib

# directory of your script folder
scripts_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))+"/../scripts/")


for root, dirs, files in os.walk(scripts_dir):
    # traverse the folder and find ones that has foo.py
    if 'foo.py' in files:
        sys.path.append(root)
        out = importlib.import_module('foo', package=root)

        # call the function in foo.py.  
        #In this case, I assumed there is a function called test 
        met = getattr(out, 'test')
        print(met())

        # clean up the path and imported modules
        sys.path.remove(root)
        del sys.modules['foo']
禄源
2023-03-14

我建议您更改脚本,为它们创建一个包,如图所示。然后,您可以通过以下方式单独访问每个脚本:

import scripts.script_1.foo

from scripts.script_1 import foo

迭代导入:

要遍历文件夹并导入它们,可以使用python的“importlib”库。您需要使用此库中的“导入模块”功能。尽管如此,您仍然需要包括_uinit。在每一个目录中。此处说明了使用此函数导入模块的示例。

 类似资料:
  • 我有以下目录结构: b、 py需要在a.py中导入一个类。因此,我可以在导入a之前将以下行添加到b.py。 sys.path.append(os.path.dirname(sys.argv[0])) 这是可行的,我可以从任何目录调用b.py,它也可以导入a。但是,当我在另一个目录中编写脚本以使用execfile()调用此文件时,这将失败。 我尝试了相对导入,但得到了“在非包错误中尝试相对导入” 我

  • 我的中有一个模块,如下所示: module.py 我稍后使用调用此脚本。这个脚本大部分时间都可以工作,但我发现我被CD到了一个目录中,其中有一个文件夹,里面有,Python更喜欢这个文件夹,而不是我的中的其他模块。我认为这是因为Python将文件夹视为一个隐式的、相对的导入(我使用的是Python2.7)。 如何使Python不将$pwd中的文件夹视为隐式相对导入? 和我使用的每个其他模块都包含了

  • 问题内容: 如何从父目录进行相对导入? 来自: 这给出了一个模棱两可的错误: 如何从父目录本地导入? 问题答案: 感谢您添加到您的问题。首先是一个答案,然后是一些解释。我建立了您的代码, 去获得,就像你拥有它一样。(我忽略了错误消息。) 如您所愿,将导入行设置回“ ../../../meme”。 (注释掉一些包含未使用变量的代码。) 然后在梅梅/ CMD /米姆目录,要么或者工作。 刚才我说去安装

  • 问题内容: 如何导入驻留在父目录中的模块(python文件)? 这两个目录中都有文件,但是我仍然无法从父目录导入文件? 在此文件夹布局中,脚本B尝试导入脚本A: 脚本B中的以下代码不起作用: 问题答案: 您无需在Python中导入脚本,而可以导入模块。一些python模块也是可以直接运行的脚本(它们在模块级别上做了一些有用的工作)。 通常,最好使用绝对进口,而不是相对进口。 在: 如果您想作为脚本

  • 问题内容: 我有以下内容: 我正在尝试从父目录导入。在这种情况下,我尝试从测试文件夹中运行“ UnitTest1.py”,并从其上方的目录(文件“ ModuleFile.py”)导入。 我知道已经有很多答案。 SO问题1,SO问题2,其他所有SO问题。我只是找不到“使用../”作为相对导入而不是显式路径。 我知道从Python 2.5开始,根据提到使用的文档,它们支持“相对导入”,但是我专门尝试这

  • 问题内容: 给定相对路径,如何导入Python模块? 例如,如果包含和,和包含,我怎么导入到? 这是一个视觉表示: 希望包含,但是重组文件夹层次结构不是一种选择。 问题答案: 假设你的两个目录都是真实的Python包(文件中确实有文件),那么这是一个相对于脚本位置包含模块的安全解决方案。 我假设你想这样做,因为你需要在脚本中包括一组模块。我在多个产品的生产环境中使用了此功能,并在许多特殊情况下工作