如何pip安装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

我正在尝试编写一个Python程序,我可以
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,请检查我在回答中添加的最小示例。