当前位置: 首页 > 知识库问答 >
问题:

作为脚本的Python模块[副本]

公羊信厚
2023-03-14
program.py
modules/__init__.py
modules/mod1.py
modules/mod2.py
modules/utils.py

program.py包括modules/目录中的所有模块,而modules/中的模块通过从.utils import*包括modules/utils.py

在运行program.py时,上面的操作很好。但是,mod1.pymod2.py也作为它们自己的脚本工作,但是运行Python mod1.py会出现错误

from .utils import *
ModuleNotFoundError: No module named '__main__.utils'; '__main__' is not a package

从导入中删除.可以使各个脚本正常工作,但主program.py脚本找不到utils

我如何使导入对主程序和单个模块都起作用?

共有1个答案

佴波鸿
2023-03-14

您可能会发现有一个单一的点访问您的程序更好。如果这是一个命令行实用程序,您可以使用命令行解析器(如内置argparse)或外部库(如click)为所有功能创建一个包装器。

使用click,您可以添加一个名为CLI.PY的文件,并将其作为您的单一访问点,然后使用标志来访问程序的不同功能。并使用setuptools,您可以为程序创建一个干净的入口点。

因此您的文件结构变为:

|-__init__.py
|-program.py
|-cli.py
|-setuptools.py
|-modules
  |-mod1.py
  |-mod2.py
  |-utils.py

cli.py:

import click
import program

@click.group()
def cli():
    pass

@cli.command()
def program():
    program.run_the_program()

@cli.command()
def mod1():
    program.mod1.run_the_program()

@cli.command()
def mod2():
    program.mod2.run_the_program()

if __name__ == '__main__':
    cli()

和您的设置.py:

from setuptools import setup

setup(
    name="your-program",
    version="1.0",
    py_modules=["program"],
    include_package_data=True,
    install_requires=["click"],
    entry_points="""
        [console_scripts]
        program=program:cli
    """,
)

在您的目录中创建virtualenv,激活它,运行setuptoolspip install--editable,然后您应该能够使用程序程序程序mod1等从命令行运行您的程序或mod1和mod2子程序。

 类似资料:
  • 问题内容: 我需要制作一个套接字模块的副本才能使用它,并且还要对猴子的另一个套接字模块进行修补并以不同的方式使用它。 这可能吗? 我的意思是真正地复制一个模块,即在 运行时 获得与复制,将功能更改为并将其安装为扩展程序相同的结果。 问题答案: 您总是可以做一些技巧,例如导入模块,然后将其从sys.modules中删除或尝试复制模块。但是,Python已经在其标准库中提供了所需的内容。 Python

  • 我已经安装了Python 3.5附带的Lubuntu 16.04 LTS,但使用Python 2.7作为默认的Python解释器。< br >两个版本都没有安装< code>pip包。我只会使用3.5版本。因此,我安装了< code>pip3,其中包含: 然后我尝试更新版本(因为Ubuntu存储库有旧版本):$ pip3安装--升级pip3但是找不到包,并给我发了这条消息: 收集pip3<br>找

  • 问题内容: 我试图通过和安装PYAHK 这两个错误均显示以下消息: 但是…所讨论的模块实际上确实存在 有模块无法在python3中命名的原因吗?我在安装过程中错过了什么吗? 问题答案: 在Python 2中是相对导入,但在Python 3中成为绝对导入;没有全局模块“脚本”,因此错误。在Py3中,它必须是或相对导入。

  • 我正在尝试制作两个程序。我希望一个打印我居住的城市的当前天气,我希望另一个从一个在线帐户获取数据并返回它。对于这些脚本,我导入了天气模块和请求模块。当我在shell中导入它们时,没有问题,但是当我运行脚本时,它说“ImportError:No module name you weather”。我做错了什么? 壳牌: 脚本: 这也适用于“天气”模块 谢谢你

  • 问题内容: 我正在尝试用apache部署mod_wsgi来运行django应用程序,但出现了错误500内部服务器错误apache日志显示: 我的apache虚拟主机如下: 并在我的应用程序目录中具有0777权限的引用的wsgi文件: 我听说这可能是因为apache用户没有正确的权限。但是我不知道如何解决此问题。我还尝试了与www-data用户一起启动守护进程,但这并不能解决问题。 编辑: 通过将虚