我正在尝试编写一个可以pip install进行操作的Python程序,以使其具有特定的命令行别名,类似于带有awscli包的“ aws”命令(参见https://pypi.python.org/pypi/awscli/1.11.115)。

setup.py中的awscli似乎包含类似

setuptools.setup(console='bin/aws')


这大概就是使命令行“别名”起作用的原因。但是,在http://setuptools.readthedocs.io/en/latest/setuptools.html上,我无法轻松找到有关如何使用此console选项的文档或示例。

我的简化用例如下。我有一个目录sayhello,其中包含以下内容:

.
├── sayhello.py
└── setup.py


其中sayhello.py同时定义了一个函数(say_hello)和一个if __name__ == "__main__"块来调用此函数:

def say_hello():
    print("Hello, world!")

if __name__ == "__main__":
    say_hello()


我尝试过的setup.py

from setuptools import setup, find_packages

setup(name="sayhello", version="1.0", packages=find_packages(), console="/bin/sayhello")


然后在sayhello目录中,

pip install .


(在virtualenv venvsource venv/bin/activate之后在虚拟环境中执行此操作)。此后,例如,我可以在Python shell中进行import sayhellosayhello.say_hello()的操作,但是我尝试定义的键盘快捷键sayhello不起作用。

如何修改setup.py,以使命令sayhello触发if __name__ == "__main__"中的sayhello.py块?

最佳答案

首先,我相信您需要将sayhello.py放入带有__init__.py的目录中,以便find_packages可以找到它(这是entry_points方法的要求)。我不确定(我从来没有尝试过),但是我一直在尝试,没有它就无法使它起作用。

我知道有两种创建命令行可运行脚本的方法:entry_pointsscripts

entry_points是更强大的选项,但需要脚本的功能成为软件包的一部分(这意味着它位于软件包的模块中。如果将sayhello.py移至带有sayhello文件的__init__.py目录中,它看起来像这样:

entry_points={
    'console_scripts': [
        'say_hello = sayhello.sayhello:say_hello'
    ]
}


更简单的选项是scripts。只需添加:

scripts=['sayhello.py']




这是我正在工作的东西:

setup.py

从setuptools导入安装程序,find_packages

setup(
    name="sayhello",
    version="1.0",
    packages=find_packages(),
    entry_points = {
        'console_scripts': [
            "sayhello = sayhello.sayhello:say_hello"
        ]
    }
)


目录结构:

.
├── sayhello
│   ├── __init__.py
│   └── sayhello.py
└── setup.py


sayhello.py

def say_hello():
    print("Hello, world!")

if __name__ == "__main__":
    say_hello()

关于python - 如何点安装Python程序,使其具有命令行快捷方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44888963/

10-15 16:24