Ser*_*sky 8 python module python-module
我想要模块/包结构如下:
/__init__.py
/mymodule.py
/mymodule/
/mymodule/__init__.py
/mymodule/submodule.py
Run Code Online (Sandbox Code Playgroud)
然后使用以下模块:
import mymodule
import mymodule.submodule
Run Code Online (Sandbox Code Playgroud)
但似乎文件" mymodule.py "与" mymodule "目录冲突.
这里的正确命名约定是什么?
Blc*_*ght 13
如果要创建包,则必须了解Python如何将文件名转换为模块名称.
假设解释器在Python搜索路径的目录中找到该文件,该文件mymodule.py将可用mymodule.如果您使用的是不区分大小写的文件系统,则它也可以使用不同的大写形式导入(但您应该避免使用此类依赖于系统的行为).
包是包含__init__.py文件的目录.最近有一些运动允许没有这些文件的软件包,但我会忽略这个答案的不太常见的情况.包成为Python中的一个模块,其代码来自该__init__.py文件.所以文件mypackage/__init__.py可以导入为mypackage.
对于__init__.py直接在Python搜索路径中的文件没有任何意义(好吧,我想你可以将它导入一个__init__模块,但这可能是一个坏主意).
那么,对于您的情况,这是适当的文件系统布局:
toplevel/
mymodule/
__init__.py # put code here for mymodule
submodule.py # put code here for mymodule.submodule
Run Code Online (Sandbox Code Playgroud)
只有toplevel文件夹应该在Python搜索路径中.
你正在处理一个包.你应该拥有的包结构是:
/some-parent-directory # This needs to be on sys.path
/mymodule # This is not really a module - it's a package
__init__.py # import mymodule
# init is loaded when you `import mymodule` or anything below it
some.py # import mymodule.some
implementation.py # import mymodule.implementation
files.py # import mymodule.files
/submodule
__init__.py # import mymodule.submodule
# init is loaded when you `import mymodule.submodule` or anything below it
submodule_impl.py # import mymodule.submodule.submodule_impl
goes.py # import mymodule.submodule.goes
here.py # import mymodule.submodule.here
Run Code Online (Sandbox Code Playgroud)
只要父目录打开,sys.path您就可以调用import mymodule或from mymodule.submodule import something不调用.
如果您希望从包的根级别(即from mymodule import SomeItem或从子包中from mymodule.submodule import AnotherItem)获得某些内容,则可以将其导入相应的__init__.py文件中.
因此,例如,假设您希望模块中CustomClass定义的类submodule_impl.py可以直接从中导入submodule.您submodule/__init__.py必须包含以下内容:
from .submodule_impl import CustomClass
Run Code Online (Sandbox Code Playgroud)
然后你就可以CustomClass直接从submodule(即from mymodule.submodule import CustomClass)导入