我正在尝试编写一个可以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 venv
和source venv/bin/activate
之后在虚拟环境中执行此操作)。此后,例如,我可以在Python shell中进行import sayhello
和sayhello.say_hello()
的操作,但是我尝试定义的键盘快捷键sayhello
不起作用。如何修改
setup.py
,以使命令sayhello
触发if __name__ == "__main__"
中的sayhello.py
块? 最佳答案
首先,我相信您需要将sayhello.py放入带有__init__.py
的目录中,以便find_packages
可以找到它(这是entry_points
方法的要求)。我不确定(我从来没有尝试过),但是我一直在尝试,没有它就无法使它起作用。
我知道有两种创建命令行可运行脚本的方法:entry_points
和scripts
。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/