代码之家  ›  专栏  ›  技术社区  ›  Arkidiusz

如何导入与我试图从该目录外运行的文件位于同一目录中的python文件?

  •  0
  • Arkidiusz  · 技术社区  · 1 年前

    PS C:\Users\arkad\Documents\repos\backpack-calculator> python C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py Traceback (most recent call last): File "C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py", line 3, in <module> from src.main_window import MainWindow ModuleNotFoundError: No module named 'src'

    我似乎不知道如何以相对论的方式正确导入python模块。人们是怎么做到的?

    我尝试更改所有导入语句以排除src目录,其他测试目录中的文件除外。这修复了问题,并允许我运行main.py,但之后我将无法通过运行pytest命令来运行测试

    Import a module from a relative path 这不能回答我的问题。在这种情况下,当我试图从同一目录导入时,有人试图导入另一目录中的文件。

    最小示例:

    包含main.py和main_window.py的src目录 尝试使用命令从src目录外运行main.py python .\src\main.py main.py:

    from src.main_window import MainWindow
    
    if __name__ == '__main__':
        mainWindow = MainWindow()
    

    main_window.py:

    class MainWindow():
        def __init__(self):
            print('test')
    
    2 回复  |  直到 1 年前
        1
  •  1
  •   Dunes    1 年前

    您将面临python如何确定从何处导入模块的问题。

    当你跑步时 python main.py ,python将在当前目录中查找 main.py 然后在当前目录中查找导入的模块。然而,当你这样做的时候 python path\to\main.py 或者当使用绝对路径时,事情开始有点不同。Python仍然会尝试从当前目录中查找文件(如果给定了相对路径)。但是,它将在包含主文件的目录中查找,而不是在当前目录中查找导入的模块。所以 C:\path\to 以我的例子或 C:\Users\arkad\Documents\repos\backpack-calculator\src 在你的。所以你可以看到它找不到一个名为 src.main_window .

    您可以尝试多种不同的解决方案。

    使用PYTHONPATH

    您可以通过设置一个名为 PYTHONPATH 。我相信在PowerShell中,这样做的语法是:

    Set-Item -Path env:PYTHONPATH -Value 'C:\Users\arkad\Documents\repos\backpack-calculator'
    python C:\Users\arkad\Documents\repos\backpack-calculator\src\main.py
    

    使用 -m 命令行选项

    通过使用 -m 我们告诉python我们希望它从当前目录中找到的模块(而不是文件)的名称。例如

    cd C:\Users\arkad\Documents\repos\backpack-calculator
    python -m src.main # src\main.py -> src.main
    

    使用填充程序主脚本

    在包含的文件夹中创建一个文件 src 目录并使其导入您的主脚本可以调用其入口函数。

    # newmain.py
    from src.main import main  # assuming you have a function called main
    main()
    
    cd C:\Users\arkad\Documents\repos\backpack-calculator
    python newmain.py
    

    更改您的导入

    既然你知道如果你跑步 python C:\path\to\src\main.py ,该python将在中查找模块 C:\path\to\src ,那么你不需要做 from src.foo import bar 。你可以改为 from foo import bar .

        2
  •  0
  •   Michał Szajkowski    1 年前

    如果您有:

    1. 此文件夹结构:
    └───backpack
        └───src
                main.py
                x.py
    
    1. 您的工作目录是/背包>
    2. 运行python src/main.py

    然后python将在两个地方搜索导入(我在这里简化了很多):

    • 在已安装的程序包路径中
    • 在您运行的.py文件的目录中(因此,在src/内部)

    因此,您可以使用以下命令从main.py导入x.py:

    import x
    

    如果你想这样做:

    import src.x
    

    然后您必须将x放在src文件夹中:

    └───backpack
        └───src
            │   main.py
            │
            └───src
                    x.py
    

    或者,您必须让python从第三个位置(从您的工作目录)查找包。 您可以通过将main.py作为一个模块运行来实现这一点:

    python -m src.main
    

    不过,src布局存储库的更常见做法是将pytest作为模块运行:

    python -m pytest
    

    这将使pytest能够从您的工作目录中导入内容:)

    有关更多pytest-src布局的良好实践,请参阅: https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html