我试图编写一个我可以pip install
的Python程序,以便它有一个特定的命令行别名,类似于' aws'使用awscli
包的命令(参见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
阻止?
答案 0 :(得分:2)
假设您的软件包的根目录中有sayhello.py
。然后只需在setup.py
中添加scripts
:
setup(
...
scripts=['sayhello.py']
)
习惯上将所有脚本放在scripts/
dir中,使它们可执行,并在第一行放置hashbang(#!/usr/bin/env python
)。
第二种方法是通过console_scripts
:
setup(
...
entry_points = {
'console_scripts': ['sayhello=sayhello:say_hello'],
}
...
)
在sayhello.py
put:
#!/usr/bin/env python
print "Hello!"
和setup.py
:
from setuptools import setup
setup(
name="sayhello",
version="0.0.1",
scripts=['sayhello.py']
)
运行pip install .
后,您应该将sayhello.py
脚本复制到虚拟环境的bin
目录(位于PATH
中)。
测试脚本:
$ sayhello.py
Hello!
答案 1 :(得分:1)
首先,我认为您需要将sayhello.py放入__init__.py
的目录中,以便find_packages
找到它(这是entry_points
方法的要求)。我不确定(我从来没有尝试过),但我现在一直在努力,没有它就无法让它工作。
我知道有两种创建命令行可运行脚本的方法:entry_points
和scripts
。
entry_points
是更强大的选项,但要求脚本的功能成为您的包的一部分(意味着它位于包中的模块中。如果您将sayhello.py
移动到{{1}带有sayhello
文件的目录,它看起来像这样:
__init__.py
更简单的选项是entry_points={
'console_scripts': [
'say_hello = sayhello.sayhello:say_hello'
]
}
。只需添加:
scripts
以下是我的工作:
scripts=['sayhello.py']
来自setuptools导入设置,find_packages
setup.py
目录结构:
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