Python 导入问题:为什么我的 Python 代码意外地尝试导入模块函数?

问题描述 投票:0回答:1

当我运行顶级文件

downloader.py
时,我收到意外的导入错误,这是意外的,因为我认为该函数在
downloader.py
调用它时已完成。我不确定应该在哪个文件中解决这个问题。我正在 VS Code 中运行并使用 VS Code 生成的 venv

from downloader_mod.shelf import ShelfData
  File "c:\archive_shelf_flaskbased\src\downloader_mod\shelf.py", line 6, in <module>
    from directory_handler import DirectoryNameHandler
ModuleNotFoundError: No module named 'directory_handler'

当我直接运行

shelf.py
时,调用该类的地方,它运行良好。 当我在子模块中添加
downloader.py
调用之前运行
DirectoryNameHandler()
时,它运行良好。

文件结构:

archive_shelf_flaskbased/
  .vscode/
  src/
    [app.py] * to do
    [views.py] * to do
    downloader.py
    logging_config.py
    __init__.py
    downloader_mod/
        directory_handler.py
        download.py
        page.py
        shelf.py
        __init__.py

我尝试过的:

  • 我将
    from downloader_mod.directory_handler import DirectoryNameHandler
    添加到
    downloader.py
    ,但没有什么区别。
  • __init__.py
    添加到
    downloader_mod
    文件夹中。这也没有什么区别。
  • 从 venv 中的命令行运行没有效果
(venv) PS C:\archive_shelf_flaskbased\src> & "c:/Goodreads Bookshelf Tool/archive_shelf_flaskbased/venv/Scripts/python.exe" "c:/Goodreads Bookshelf Tool/archive_shelf_flaskbased/src/downloader.py"
Traceback (most recent call last):
  File "c:\archive_shelf_flaskbased\src\downloader.py", line 3, in <module>
    from downloader_mod.shelf import ShelfData
  File "c:\archive_shelf_flaskbased\src\downloader_mod\shelf.py", line 6, in <module>     
    from directory_handler import DirectoryNameHandler
ModuleNotFoundError: No module named 'directory_handler'

我没有尝试过:

  • 我还没有尝试修改 PYTHONPATH 因为我不确定这是问题所在还是要更改的正确设置。如果是的话,需要添加什么以及在哪里添加。它是进入
    .vscode/settings.json
    .vscode/launch.json
    .env
    还是命令行更改?

文件代码:

src/downloader.py

from downloader_mod.shelf import ShelfData
from downloader_mod.directory_handler import DirectoryNameHandler

logger = logging.getLogger(__name__)
setup_logging()
sh = ShelfData({'shelf_name': "Generic", 'creation_date': "02/25/2023"})
sh.setup_download_dir()
print(f"{sh.simple_dir = }")

src/downloader_mod/shelf.py

from directory_handler import DirectoryNameHandler

class ShelfData:
    def __init__(self, data_dict=None):
        self.initialize_shelf_dict()
        if data_dict is not None:
            self.add_data_to_shelf_dict(data_dict)
        # self.shelf_name and self.creation_date made above
        dn = DirectoryNameHandler(self.shelf_name, self.creation_date)
        self.simple_dir = dn.simple_dir

downloader_mod/directory_handler.py

from datetime import datetime

class DirectoryNameHandler:
    def __init__(self, shelf_name, date_obj) -> None:
        year = f'{date_obj.year}'
        self.simple_dir = f"{shelf_name}_{date_obj.strftime('%b%d')}"
python python-import
1个回答
0
投票

运行脚本时,模块搜索路径上只有

src
,而不是
download_mod

shelf.py
应该使用 relative 导入,而不是假设
directory_handler.py
也是顶级模块。

from .directory_handler import DirectoryNameHandler
© www.soinside.com 2019 - 2024. All rights reserved.