#背景和Problem#我正在尝试建立一个网络-刮刀来备份我的社交媒体帐户(夏季项目,我知道这是没用的)。
我正在尝试创建一个很好的类结构,所以我提出了以下结构(我接受批评,我对编程非常陌生):
\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#
__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 import,No module named '__main__.Files'或Attempted relative import beyond top-level package。
#预期behavior#
我已经习惯了Java的这种方式,而且我不知道如何在Python中实现这一点。好像搞砸了。我真的很怀念在编译器运行的地方添加一个package和一个文件夹树。
敲桌子 一定有更好的办法
##THANKS!##
发布于 2019-01-28 06:49:04
很多东西都是关于这个的..。然而,大多数指南关注的是你如何做到这一点,而不是做些什么。
我是如何做到的(用于中小型项目):
sys.path。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包含:
from . import File
from . import Image
from . import Video发布于 2019-01-28 06:13:11
我会支持Damian和user2357112的评论--在创建模块时尽量避免文件夹、文件和类/函数之间的名称冲突。
如果不将其添加到PYTHONPATH中,您可能无法导入当前工作目录之外的任何内容。向PYTHONPATH环境变量添加一个文件夹意味着python在导入模块时总是会检查该文件夹,因此您可以从任何地方导入该文件夹。
在这方面已经有了一条很好的线索,这将使您走上正确的方向:永久添加一个目录到PYTHONPATH? (在一篇文章中要介绍的内容很多)。
https://stackoverflow.com/questions/54395403
复制相似问题