如何使用 if __name__ == ' __main__' 条件创建控制台脚本?

问题描述 投票:0回答:2

我正在为 python 脚本安装创建一个安装文件。通常,文档使用例如下一个安装文件:

from setuptools import setup

# setup.py file
setup(name='test',
      version='0.0.0',
      packages=['test'],
      entry_points={
      'console_scripts': [
              'test = test.test:main'
           ]
         },
      )

将此称为:

# test/test.py file
def main():
    print('Hello!')

if __name__ == '__main__':
    main()

但是,我的问题是我的“主”代码函数位于 if __ name__ == '__ main __' 条件之下。我无法创建 main() 函数,因为这代表了开发工作的巨大变化

有什么解决办法吗?或者我必须花时间创建一个 main() (或任何名称)函数?

python pip setuptools
2个回答
1
投票

据我了解,您有一堆代码,您只想在未导入文件时调用这些代码(这就是 if 语句的作用)。但是,我敢肯定,在每行之前添加一个制表符会非常烦人。

解决方案:使用类似于 this 的内容(如果您有 Linux,则可以使用;当然还有替代解决方案),即

sed -i 's/^/\t\t/' <filename>
位于单独的文件中,并将主代码复制粘贴到其中以添加选项卡。将此选项卡式代码复制粘贴到您的
def main():
中,瞧。

但是,看起来这只是要导入的,这就是您使用 setup.py 文件的原因......在这种情况下您不需要这样做,因为大概您想要这段代码运行,这就是你导入它的原因。 (除非是一些测试的东西。)


0
投票

您可以使用以下

run_module
帮助程序将模块作为函数运行

# run_module/__init__.py

import runpy
from dataclasses import dataclass


def __getattr__(name: str):
    return _RunModule(name)


@dataclass
class _RunModule:
    module: str

    def __getattr__(self, name: str) -> "_RunModule":
        return _RunModule(f"{self.module}.{name}")

    def __call__(self) -> None:
        runpy.run_module(self.module, run_name="__main__")

给定一个可以与

my_package.my_module
一起运行的模块
python -m my_package.my_module
,通过
run_module
帮助程序,您可以使用
run_module:my_package.my_module
作为
console_scripts
入口点。

© www.soinside.com 2019 - 2024. All rights reserved.