【问题标题】:Python module that imports from subdirectory can't find images located in there从子目录导入的 Python 模块找不到位于其中的图像
【发布时间】:2021-10-29 11:49:20
【问题描述】:

我有一个项目,我决定将其划分为子文件夹。我的主模块 main.py 从子文件夹导入其他模块 mod1.py。导入的模块mod1.py 使用位于另一个子文件夹中的图像并相对引用它们。我不能使用驱动器的绝对路径,但我知道从项目结构开始的相对路径。

情况如下图所示

project
├── main.py
└───subfolder
     ├───mod1.py
     └───pictures
          └───pic1.png

所以在mod1.py中有一行:

image = Image.open("./pictures/pic1.png")

当我在main.py 中导入mod1.py 并运行程序时出现错误:

FileNotFoundError: [Errno 2] No such file or directory: './pictures/pic1.png'

当我运行main.py并导入一个相对引用它们的模块时,如何访问这些图片?

我在子文件夹中有__init__.py 文件,所有导入都在工作。

【问题讨论】:

标签: python module


【解决方案1】:

试试这个

try:
    image = Image.open("pictures/pic1.png")
except FileNotFoundError:
    image = Image.open("subfolder/pictures/pic1.png")

所以python会尝试第一个路径,如果失败,它会尝试第二个,它会寻找main.py文件

【讨论】:

  • 整个项目要大得多,我可能会遇到这个问题 2-3 次,并且需要进行尽可能多的尝试——除了配对。它应该可以工作,但我正在寻找一种正确的方法来做到这一点。
  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
【解决方案2】:

虽然豪尔赫的答案在某些情况下可能有效,但我建议您了解为什么您的答案无效,并看看其他人是如何解决这个问题的。让我们举一个非常简单的例子。

project
  dir1
    test.py
    dir2
      test2.py

假设我的项目目录的完整路径位于 /Users/sstacha/tmp/test_python/ 并且我的 2 个测试文件包含以下内容

test.py

import os
from pathlib import Path

from dir2.test2 import function2

def function1():
    path = os.getcwd()
    print(f"function1.os.cwd(): {path}")

    DIR = Path(__file__).resolve()
    print(f"function1.pathlib_path: {DIR}")

function1()
function2()

test2.py

import os
from pathlib import Path

def function2():
    path = os.getcwd()
    print(f"function2.os.cwd(): {path}")

    DIR = Path(__file__).resolve()
    print(f"function2.pathlib_path: {DIR}")

如果我从项目目录执行 python dir1/test.py,我会得到以下输出:

$ python dir1/test.py
function1.os.cwd(): /Users/sstacha/tmp/test_python
function1.pathlib_path: /Users/sstacha/tmp/test_python/dir1/test.py
function2.os.cwd(): /Users/sstacha/tmp/test_python
function2.pathlib_path: /Users/sstacha/tmp/test_python/dir1/dir2/test2.py

如果我改为 cd 到 dir1 并执行 python test.py 我得到这个输出:

$ python test.py
function1.os.cwd(): /Users/sstacha/tmp/test_python/dir1
function1.pathlib_path: /Users/sstacha/tmp/test_python/dir1/test.py
function2.os.cwd(): /Users/sstacha/tmp/test_python/dir1
function2.pathlib_path: /Users/sstacha/tmp/test_python/dir1/dir2/test2.py

所以你的实际问题是 os.cwd() 将始终设置为运行 python 命令时操作系统设置的任何目录。我还包含了 Django 设置文件如何为 python >= 3.4 处理此问题的一行。如您所见,这种方法将与定义您的函数的任何文件相关,无论从哪个目录调用 python 可执行文件,这应该是一个更好/更便携的解决方案。

希望这可以帮助您更好地了解您的问题以及可能对您有用的解决方案。

我意识到我从来没有真正完全回答过这个问题,这里就是一个例子:

DIR = Path(__file__).resolve().parent
image = Image.open(DIR+"/pictures/pic1.png")

顺便说一句,如果您使用的是 3.4 之前的版本,那么 Django 设置文件就是这样处理它的:

DIR = os.path.dirname(os.path.abspath(__file__))
image = Image.open(DIR+"/pictures/pic1.png")

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 2017-03-18
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2012-05-19
    相关资源
    最近更新 更多