Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造python模块,使其可以在带或不带-m开关的命令行中运行 背景_Python_Python 3.x_Command Line_Module_Python Import - Fatal编程技术网

构造python模块,使其可以在带或不带-m开关的命令行中运行 背景

构造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文件之间的关系。目前的结构

我正在研究Python模块,它由许多脚本组成。最终目标是在交互工作时通过
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运行而不调用
    python
    解释器。我不知道如何使用tree:

    |-- my_module
    |   |-- my_module.py
    |   |-- __init__.py
    |   |-- __main__.py
    |   |-- module_component_A.py
    |   |-- utilities.py
    
    是否有特定内容应转到my_module.py


Python 3没有隐含的相对导入。使用绝对或显式相对导入:

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__