首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >又一次Python相关的导入灾难

又一次Python相关的导入灾难
EN

Stack Overflow用户
提问于 2019-01-28 04:05:47
回答 2查看 457关注 0票数 1

#背景和Problem#我正在尝试建立一个网络-刮刀来备份我的社交媒体帐户(夏季项目,我知道这是没用的)。

我正在尝试创建一个很好的类结构,所以我提出了以下结构(我接受批评,我对编程非常陌生):

代码语言:javascript
复制
\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目前都是空的。任何没有扩展和开头的东西都是一个文件夹。每个文件都有一个与文件名相同的类)

#Questions#

  1. 在哪里可以确切地了解Python的打包系统?有什么书或网站推荐吗?
  2. 如何将图像导入GraphImage?如何将文件导入SocialMediaPost?
  3. 我需要用__init__.py写什么,这样import SOME_PACKAGE才能导入每个模块?(例如:导入文件并使Files.Image和File.Video可访问)。

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

#要完成将文件导入SocialMediaPost,我有tried:#

from Files.File import File

from ...Files.File import File

import File

from File import File

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

我总是得到Unable to importNo module named '__main__.Files'Attempted relative import beyond top-level package

#预期behavior#

我已经习惯了Java的这种方式,而且我不知道如何在Python中实现这一点。好像搞砸了。我真的很怀念在编译器运行的地方添加一个package和一个文件夹树。

敲桌子 一定有更好的办法

##THANKS!##

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-28 06:49:04

很多东西都是关于这个的..。然而,大多数指南关注的是你如何做到这一点,而不是做些什么。

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

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

使用您的结构的具体示例。假设您的入口点可能位于\SocialMedia\SocialMediaFeed.py中,请使用导入语句:

  • 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包含:

代码语言:javascript
复制
from . import File
from . import Image
from . import Video
票数 3
EN

Stack Overflow用户

发布于 2019-01-28 06:13:11

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

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

在这方面已经有了一条很好的线索,这将使您走上正确的方向:永久添加一个目录到PYTHONPATH? (在一篇文章中要介绍的内容很多)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54395403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档