Python3 模块导入混乱

Python3 module import confusion

当我使用 pip 安装 python 模块(例如 mediafile)时,我可以像这样导入它:

from mediafile import MediaFile

而且效果很好。

但是后来我把它安装到不同的位置(pip install --target="C:/msys64/home/myname/myprogram/tools/mediafile/" mediafile),我只能这样导入它:

from tools import mediafile

并且导入 MediaFile 只是行不通。 (我尝试了 from tools.mediafile import MediaFile 和其他几个变体但没有成功)。

这是一个输出:

ImportError: cannot import name 'MediaFile' from 'tools.mediafile' (unknown location)

当我尝试使用 mediafile.MediaFile 时,它给我这个错误:

AttributeError: module 'tools.mediafile' has no attribute 'MediaFile'

知道我哪里语法错了吗?

命令 pip install --target=/path/to/package mypackage 将在您指定的目录 中安装软件包 ,即 /path/to/package/mypackage。在您的情况下,它可能位于 C:/msys64/home/myname/myprogram/tools/mediafile/mediafile.

如果是这种情况,您应该可以通过以下方式导入它:

from tools.mediafile.mediafile import MediaFile

但不要这样做 - 相反,您应该删除它并使用

重新安装
pip install --target="C:/msys64/home/myname/myprogram/tools/" mediafile

那么你应该可以用

导入它
from tools.mediafile import Mediafile

正如您所发现的,上述方法的问题在于,包期望能够仅使用 import dependency 导入它们自己的依赖项——它们不知道您的 tools 目录.要解决此问题并使您自己的导入更容易,您需要将目录添加到您的 PYTHONPATH environment variable. See e.g. this question 以了解如何在 Windows.

中执行此操作

或者,您可以将其添加到脚本中:

import sys
sys.path.append("tools")
from mediafile import MediaFile

然而,设置 PYTHONPATH 是执行此操作的首选方法。

请注意,我假设您如上所述删除并重新安装了 mediafile,因此您的目录结构应为:

tools
├── mediafile.py
├── mutagen
├── ...