构建python模块,以便可以在带有-m开关和不带有-m开关的情况下从命令行运行它

康拉德

背景

我正在研究由许多脚本组成的Python模块。最终目标是使该模块中的功能import在进行交互工作时可通过语句导入,并通过命令行参数使模块的某些部分可执行。

期望的结果

可以使用以下命令运行模块:

python -m ./my_module --help
# No -m switch
python ./my_module --help

结构体

此答案之后,我想了解-m开关__main__.py__init__.py文件之间的关系当前结构如下

__main__.py

# Shebang line


###########
# Modules #
###########
import argparse
import logging
import tempfile


###################
# Package modules #
###################
from utilities import check_directory_access
# ...


#################
# Run functions #
#################
def run(args):
    """Run all functions with provided arguments"""
    # Start logging configuration
    # If file is not provided use temporary file
    if args.log_file is None:
        args.log_file = tempfile.NamedTemporaryFile(delete=False,
                                                    prefix='my_module',
                                                    suffix='.log').name
    # Create handlers: console
    # logging configuration
    logging.shutdown()


def main():
    """Process arguments and run main function"""
    parser = argparse.ArgumentParser(description='Dop stuff module',
                                     epilog='Epilog')
    parser.add_argument("-t", "--tables", nargs='+', dest='tables',
                        help="List tables to refresh", type=str)
    parser.add_argument("-l", "--log-file", dest='log_file',
                        type=str, help="Log file")
    parser.set_defaults(func=run)
    args = parser.parse_args()
    args.func(args)

if __name__ == "__main__":
    main()

__init__.py

###################
# Package modules #
###################
from .utilities import check_directory_access
# Other components

问题

运行:

python -m my_module --help

退货

ImportError:没有名为“实用程序”的模块

python my_module --help

没问题

期望的结果

  • 的方式,这两个语句Structring进口python my_modulepython -m my_module工作。
  • import my_module交互工作时不中断
  • (奖励)首先运行而不调用python解释器./my_module --help我不确定如何用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交换机配合使用它还允许进行import my_module交互式会话。


存储为文件夹的裸包无法直接执行。这是由于操作系统本身。如果要避免显式调用python,则必须创建一个运行程序包的可执行文件。

可以将软件包存储为可执行的zip文件,或者创建运行软件包的脚本。

#!/usr/bin/env python3
import my_module.__main__

请注意,后者要求您安装模块或直接在脚本附近。如果您的模块可以安装,则console_scripts entry_point允许自动创建此类脚本。

您不应该将脚本驻留在软件包中-这需要您更改sys.path到父目录,这可能导致重复的模块。例如,utilities.py将作为单独的模块my_module.utilities 和提供 utilities

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有GUI的情况下从命令行运行JavaFX应用

在没有 Maven 码头的情况下从命令行运行战争

Python 脚本不会从命令行运行。它显示没有错误

在没有脚本文件的情况下从命令行执行python程序

在没有秘密密钥的情况下从命令行指控S3

为什么带有GIT的TFS无法从命令行运行?

如何从命令行运行带有wine的Windows .bat脚本?

使用C ++从命令行运行带有参数的exe

如何从命令行运行带有程序名称且没有路径的python程序?

带有逻辑和的Typescript开关盒

带有 python -m 开关的 Windows 任务计划程序

在没有自定义工具的情况下从命令行导致UAC弹出窗口

如何在没有 sed 的情况下从命令行替换(PHP)文件中的电子邮件?

如何在没有用户干预的情况下从命令行静默卸载软件?

从命令行运行 jmeter 测试的输出中有哪些列?

是否有参数“速度”可从命令行运行behaviorSpace实验

如何从命令行运行具有 SCHED_RR 策略的程序?

从命令行运行Python

Linux命令行开关和参数是否有标准?

Windows命令行:有什么方法可以在不实际运行的情况下检查bat文件的语法?

获取:“ModuleNotFoundError:没有名为‘tensorflow’的模块”,仅当从命令行运行时

如何将带有值的命令行参数传递给Inno Setup Compiler,以便可以在代码中使用它们?

如何从命令行调试使用python -m运行的Python模块?

如何在没有DROP数据库权限的情况下从命令行删除所有MySQL表?

有没有办法调试使用Rscript.exe从命令行运行的R脚本

如何在没有软件包的 Windows 上从命令行运行 Junit 测试?

Perl:当我从命令行运行“ perl”时,什么都没有发生

从命令行运行时,堆栈跟踪中没有换行符吗?

代码在脚本编辑器中有效,但在从命令行运行时无效