我有一个使用Python的 click 软件包的命令行程序。我可以在本地安装和运行它,没有问题:

pip install --editable . # (or leave out the editable of course)

现在,我想创建一个可执行文件,该文件可以分发并独立运行。通常,由于我在Windows环境中,因此我会使用py2exepyinstallercx_Freeze之一。但是,这些软件包都不起作用。

更具体地说,它们都生成一个可执行文件,但是该可执行文件不执行任何操作。我怀疑这个问题是因为我的main.py脚本没有main函数。任何建议都将非常有帮助,在此先感谢您!

可以重现从here复制的代码的问题。

hello.py
import click

@click.command()
def cli():
    click.echo("I AM WORKING")

setup.py
from distutils.core import setup
import py2exe

setup(
name="hello",
version="0.1",
py_modules=['hello'],
install_requires=[
    'Click'
],
entry_points="""
[console_scripts]
hello=hello:cli
""",
console=['hello.py']
)

如果有人可以提供一个有效的 setup.py 文件来创建可执行文件和任何其他所需的文件,将不胜感激。

从控制台:
python setup.py py2exe
# A bunch of info, no errors
cd dist
hello.exe
# no output, should output "I AM WORKING"

最佳答案

我非常喜欢pyinstaller而不是其他替代方法,因此我将根据pyinstaller给出答案。

卡住后开始点击应用

您可以检测到何时使用pyinstaller卡住了程序,然后像下面那样启动click应用程序:

if getattr(sys, 'frozen', False):
    cli(sys.argv[1:])

使用pyinstaller构建exe

这个简单的测试应用程序可以通过以下方式轻松构建:
pyinstaller --onefile hello.py

测试代码:
import sys
import click

@click.command()
@click.argument('arg')
def cli(arg):
    click.echo("I AM WORKING (%s)" % arg)

if getattr(sys, 'frozen', False):
    cli(sys.argv[1:])

测试:
>dist\test.exe an_arg
I AM WORKING (an_arg)

10-08 05:38