如何pip安装Python程序,使其具有命令行快捷方式
我正在尝试编写一个Python程序,我可以如何pip安装Python程序,使其具有命令行快捷方式,python,setuptools,Python,Setuptools,我正在尝试编写一个Python程序,我可以pip安装,这样它就有了一个特定的命令行别名,类似于带有awscli包的“aws”命令(参见) 来自awscli的setup.py似乎包含以下内容 setuptools.setup(console='bin/aws') 这大概就是命令行“alias”工作的原因。然而,当时我无法轻松找到有关如何使用此控制台选项的文档或示例 我的简化用例如下。我有一个目录sayhello,其中包含以下内容: . ├── sayhello.py └── setup.py
pip安装
,这样它就有了一个特定的命令行别名,类似于带有awscli
包的“aws”命令(参见)
来自awscli
的setup.py
似乎包含以下内容
setuptools.setup(console='bin/aws')
这大概就是命令行“alias”工作的原因。然而,当时我无法轻松找到有关如何使用此控制台
选项的文档或示例
我的简化用例如下。我有一个目录sayhello
,其中包含以下内容:
.
├── sayhello.py
└── setup.py
其中,sayhello.py
既定义了一个函数(say_hello
),又定义了一个调用此函数的if uuuuuuuu name_uuuuu==“uuuuu main_uuu”
块:
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中导入sayhello
和sayhello.say_hello(),例如,但是我试图定义的键盘快捷键sayhello
不起作用
如何修改
setup.py
,使命令sayhello
触发如果sayhello.py
中的
块中的name\uuuuuu==“\uuuuuu main\uuuuuuu”?假设在包的根中有一个sayhello.py
。然后只需添加setup.py即可:
setup(
...
scripts=['sayhello.py']
)
from setuptools import setup
setup(
name="sayhello",
version="0.0.1",
scripts=['sayhello.py']
)
通常,将所有脚本放在脚本/
目录中,使其可执行,并将hashbang(#!/usr/bin/env python
)放在第一行
第二种方法是:
最简单的例子
在sayhello.py
put中:
#!/usr/bin/env python
print "Hello!"
在setup.py
中:
setup(
...
scripts=['sayhello.py']
)
from setuptools import setup
setup(
name="sayhello",
version="0.0.1",
scripts=['sayhello.py']
)
运行pip install.
后,应该将sayhello.py
脚本复制到虚拟环境的bin
目录(位于路径中)
测试脚本:
$ sayhello.py
Hello!
首先,我认为您需要将sayhello.py放入一个带有\uuuu init\uuuuu.py
的目录中,以便通过find\u packages
找到它(这是入口点
方法的要求)。我不确定这一点(没有它我从来没有尝试过),但我现在一直在尝试,没有它就无法工作
我知道有两种方法可以创建命令行可运行脚本:和
entry\u points
是一个更强大的选项,但需要脚本的功能作为包的一部分(这意味着它位于包中的一个模块中。如果将sayhello.py
移动到一个带有\uu init\uuuuuuuuuuuy
文件的sayhello
目录中,它将如下所示:
entry_points={
'console_scripts': [
'say_hello = sayhello.sayhello:say_hello'
]
}
更简单的选项是scripts
。只需添加以下内容:
scripts=['sayhello.py']
以下是我的工作成果:
setup.py
def say_hello():
print("Hello, world!")
if __name__ == "__main__":
say_hello()
从setuptools导入设置中,查找\u包
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()
在pip安装之后。
在我的虚拟环境中,如果我尝试运行命令sayhello
,我会得到-bash:sayhello:command not found
。如何打印“Hello,world”?试着运行sayhello.py
,并将!/usr/bin/env
放在第一行。在同一目录下,它可以工作(如果没有pip安装
),但是如果我转到其他目录,我会得到/Library/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python:无法打开文件“sayhello.py”:[Errno 2]没有这样的文件或目录
pip安装
应该将脚本复制到virtualenv的bin
目录(或对其进行符号链接)。请检查它是否存在。此外,您的虚拟环境必须处于活动状态。@KurtPeek,请检查我在回答中添加的最小示例。