又是一个与Python相关的导入灾难

2024-05-28 22:49:11 发布

您现在位置:Python中文网/ 问答频道 /正文

背景与问题

我正在尝试建立一个网络清理器来备份我的社交媒体账户(暑期项目,我知道这是没用的)。在

我正在尝试创建一个不错的类结构,因此我提出了以下结构(我接受批评,我对编程相当陌生):

\social-media-backup

    \Files
        __init__.py
        File.py
        Image.py
        Video.py

    \SocialMedia
        SocialMediaFeed.py
        SocialMediaPost.py
        \Instagram
            __init__.py
            \MediaTypes
                __init__.py
                GraphImage.py
                GraphVideo.py
            \SearchTypes
                __init__.py
                InstagramUser.py
        \Twitter
        \VSCO

(Twitter和VSCO目前是空的。任何没有扩展名且以\开头的内容都是一个文件夹。每个文件都有一个与内部文件同名的类)

问题

  1. 在哪里可以明确地了解Python的打包系统?有书籍或网站推荐吗?在
  2. 如何将图像导入GraphImage?如何将文件导入SocialMediaPost?在
  3. 我需要在__init__.py中写入什么以便import SOME_PACKAGE并让它导入每个模块?(例如:导入文件并文件.图像以及文件。视频无障碍)。在

)我知道有很多问题。它们是按重要性排序的)

为了完成将文件导入SocialMediaPost,我尝试了:

from Files.File import File

from ...Files.File import File

import File

from File import File

几乎任何你能想象到的组合。在

我总是得到一个Unable to importNo module named '__main__.Files'或{}。在

预期行为

我已经习惯了Java的这种方式,我不知道如何在Python中实现这一点。看起来一团糟。我真的很怀念添加一个package和一个运行编译器的文件夹树。在

敲桌子THERE MUST BE A BETTER WAY

谢谢!!在


Tags: 文件frompy图像import文件夹inittwitter
2条回答

有很多关于这个的东西。。。然而,大多数指南关注的是你怎么做,而不是做什么。在

我是如何做到的(对于中小型项目):

  1. 不要搞乱sys.path。在
  2. 有一个“projectroot”目录,下面有你的模块/包(就像你已经做的那样)。在
  3. 始终使用绝对导入,但“姐妹”模块除外。在
  4. 始终作为模块运行,即使用python -m foo.bar

使用你的结构的具体例子。假设您的入口点可能在\SocialMedia\SocialMediaFeed.py中,请使用import语句:

  • from . import SocialMediaPost(姐妹模块)
  • import Instagram(子模块)
  • from Files import Image(其他模块)

并使用:python -m SocialMedia.SocialMediaFeed运行

通过作为模块运行,您总是将项目根(social-media-backup)添加为“搜索路径”。这样,引用其子文件夹的绝对导入始终有效。顺便说一下,您可以使用import sys; print(sys.path)打印出模块搜索路径。在

其中有些可能看起来过于复杂,但我发现,只要您尝试打包安装所需的东西(关键字setup.py),遵循以上几点就可以获得很大的回报。在

编辑:回答第三个问题:让__init__.py包含:

from . import File
from . import Image
from . import Video

我将支持Damian和user2357112的评论——在创建模块时,尽量避免文件夹、文件和类/函数之间的名称冲突。在

如果不将当前工作目录添加到PYTHONPATH中,您可能无法导入当前工作目录之外的任何内容。将文件夹添加到PYTHONPATH环境变量中意味着python在导入模块时将始终检查该文件夹,因此您可以从任何地方导入它。在

已经有一个很好的线索可以让你走上正确的方向: Permanently add a directory to PYTHONPATH? (一篇博文中涉及的内容很多)

相关问题 更多 >

    热门问题