【问题标题】:Wrapper for 'python -m' command“python -m”命令的包装器
【发布时间】:2020-10-25 19:16:32
【问题描述】:

我有一个结构如下的包:

my_package
 |-- src
 |    |-- __init.py__
 |    |-- __main.py__
 |    |-- foo.py
 |    |-- bar.py
 |-- setup.py

我正在尝试在 ma​​in.py 中导入 foo 和 bar,但在使用命令 python my_package 执行时会出现 ModuleNotFoundError 来自终端,但使用 my_package 目录中的命令 python -m src 运行良好。我想排除 -m 标志。我在互联网上找到的所有材料都指向两件事

  • 将包位置设置为 sys.path。
  • 将包位置设置为 PYTHONPATH 变量。

我做了这两件事,但到目前为止没有一个对我有用。

编辑: 正如 cmets 中所建议的,包装器是适合此问题的解决方案。但我无法弄清楚那里有什么逻辑。任何帮助都会有所帮助。

【问题讨论】:

  • 为什么你认为可以使用忽略包状态的命令运行 Python
  • @DavisHerring 根据我对您的问题的理解,您问我为什么要从命令中省略 m 标志?它看起来有点凌乱或对用户不友好。
  • 但是python foo 有一个含义,而且含义不同。如果您想要一个漂亮/简短的命令行,请将其包装在 shell 脚本中。
  • python foo 不就是用来执行 foo 脚本的吗?而且我知道这可以通过使用别名来完成,但我正在从事的项目有多个贡献者。所以每个人都必须自己做,这看起来很不愉快。
  • 非常感谢您的更正。至于你的问题python脚本的答案。

标签: python modulenotfounderror


【解决方案1】:

标准库有一个模块 runpy 用于此目的:制作一个仅包含的脚本

import runpy
runpy.run_module("my_package",alter_sys=True)

然后在那个文件上运行python将等同于python -m my_package——包括通过PYTHONPATH适当设置sys.path的要求或将脚本放在包含my_package 的目录中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    相关资源
    最近更新 更多