正如标题所示,我正在尝试从命令行访问python脚本。我发现click和argv之类的库可以很容易地访问从命令行传递的参数,但是用户仍然必须通过Python运行脚本。
代替
python /location/to/myscript.py
我希望能够做到
myscript
从任何目录
据我了解,我可以通过编辑PATH变量在计算机上实现此目的。但是,我希望能够做到:
pip install myscript
,然后从任何地方键入myscript
来访问脚本。我会在setup.py
中放入一些特殊代码吗?
答案 0 :(得分:3)
使用 console_scripts
挂钩到特定的 Python 方法(不调用整个可执行文件),setup.py
文件:
from setuptools import setup
setup(
...
entry_points = {
'console_scripts': ['mybinary=mymodule.command_line:cli'],
},
name='mymodule',
...
)
command_line.py
脚本将是:
import mymodule
def cli():
print("Hello world!")
项目目录如下所示:
myproject/
mymodule/
__init__.py
command_line.py
...
setup.py
答案 1 :(得分:2)
您可以使用setuptools
一个不错的setup.py
的示例(例如,您的包装要求使用pandas和numpy):
import setuptools
setuptools.setup(
name='myscript',
version='1.0',
scripts=['./scripts/myscript'],
author='Me',
description='This runs my script which is great.',
packages=['lib.myscript']
install_requires=[
'setuptools',
'pandas >= 0.22.0',
'numpy >= 1.16.0'
],
python_requires='>=3.5'
)
您的目录应设置如下:
[dkennetz package]$ ls
lib scripts setup.py
内部lib将是:
[dkennetz package]$ ls lib
myscript
在myscript
内的将是:
[dkennetz package]$ ls lib/myscript
__main__.py
__init__.py
helper_module1.py
helper_module2.py
main将用于调用您的函数并执行您想做的任何事情。
内部脚本为:
[dkennetz package]$ ls scripts
myscript
,myscript
的内容将是:
#!/usr/bin/env bash
if [[ ! $@ ]]; then
python3 -m myscript -h
else
python3 -m myscript $@
fi
然后运行:python setup.py install
这将安装程序和setup.py中install_requires=[]
中包含的所有依赖项,并将myscript
作为命令行模块安装:
[dkennetz ~]$ myscript
答案 2 :(得分:0)
假设您位于bash外壳中,并且已安装python 3,并且希望能够执行所请求的操作,则需要将脚本文件的路径附加到.bash_profile
中的PATH变量中文件放在您的主目录中。另外,在python脚本文件中,您需要具有与以下内容相似的内容作为脚本的第一行:
#!/usr/bin/env python3
此外,您可以从脚本文件中删除扩展名(.py),如上面的示例所示,文件名是与script.py相对的脚本。
您还需要将文件名的权限设置为
chmod 755文件名
如果希望该脚本可在整个系统范围内访问,则需要修改/ etc / profile并将其添加到文件的底部:
export PATH=$PATH:/path/to/script
或者,如果将python脚本文件移动到/usr/local/bin
,则由于该目录通常已经在PATH中,因此可能无需进行任何配置文件更改。
要查看PATH的值,请在shell上发出以下命令
echo $PATH