构造python模块,使其可以在带或不带-m开关的命令行中运行 背景
我正在研究Python模块,它由许多脚本组成。最终目标是在交互工作时通过构造python模块,使其可以在带或不带-m开关的命令行中运行 背景,python,python-3.x,command-line,module,python-import,Python,Python 3.x,Command Line,Module,Python Import,我正在研究Python模块,它由许多脚本组成。最终目标是在交互工作时通过import语句使此模块中的函数可导入,并通过命令行参数使模块的某些部分可执行 预期结果 模块可以使用以下方式运行: python -m ./my_module --help # No -m switch python ./my_module --help 结构 接下来,我想了解-m开关与\uuuuuu main\uuuuuuuuuu.py和\uuuuuu init\uuuuuuuuuuuy.py文件之间的关系。目前的结构
import
语句使此模块中的函数可导入,并通过命令行参数使模块的某些部分可执行
预期结果
模块可以使用以下方式运行:
python -m ./my_module --help
# No -m switch
python ./my_module --help
结构
接下来,我想了解-m
开关与\uuuuuu main\uuuuuuuuuu.py
和\uuuuuu init\uuuuuuuuuuuy.py
文件之间的关系。目前的结构如下
\uuuu main\uuuuu.py
\uuuu init\uuuuu.py
问题
运行:
python -m my_module --help
返回
ImportError:没有名为“实用程序”的模块
鉴于
python my_module --help
没问题
预期结果
- 以语句
和python my_module
工作的方式构造导入python-m my_module
- 交互工作时不中断
导入我的\u模块
- (奖励)通过
/my_模块--help运行而不调用
解释器。我不知道如何使用tree:python
是否有特定内容应转到my_module.py|-- my_module | |-- my_module.py | |-- __init__.py | |-- __main__.py | |-- module_component_A.py | |-- utilities.py
from .utilities import check_directory_access
from my_module.utilities import check_directory_access
这使您的包可以使用-m
开关工作。它还允许在交互式会话中导入my_模块
无法直接执行存储为文件夹的裸包。这是由于操作系统本身造成的。如果希望避免显式调用python,则必须创建一个运行包的可执行文件 将包存储为可执行zip文件,或创建运行包的脚本
#!/usr/bin/env python3
import my_module.__main__
请注意,后者要求安装模块或直接与脚本相邻。如果您的模块可以安装,a允许自动创建这样的脚本
您不应该让脚本驻留在包中-这要求您将
sys.path
更改为父目录,这可能导致模块重复。例如,utilities.py
将作为单独的模块my_module.utilities
和utilities
my_module.py的内容是什么?@MisterMiyagi目前什么都没有my_module.py
将调用\uuuu main\uuuu.py
。嗯,执行/my\u module/my\u module.py
比/my\u module/\uuuu main\uuuuu.py
漂亮,但这是一个附带的小工具。关键是模块对于交互工作是重要的,并且可以从命令行调用它来执行一些基本操作。另外,我主要是在R中编程,我习惯于使用R包架构;我想更好地理解Python的导入/导出机制;跨\uuuu main\uuuuuuuuuy.py
和\uuuuuu init\uuuuuuuuuuy.py
构建导入的良好实践是什么?@Konrad\uuuuuuuuuuuu init\uuuuuuuuuuuuuuuuy
不应该执行任何导入,除非您想要展平一些私有名称空间<代码>\uuuu main\uuuuu.py应该只导入它需要执行的东西。
from .utilities import check_directory_access
from my_module.utilities import check_directory_access
#!/usr/bin/env python3
import my_module.__main__