在 pipenv 项目中为 python 文件创建命令行别名
Posted
技术标签:
【中文标题】在 pipenv 项目中为 python 文件创建命令行别名【英文标题】:making a commandline alias to a python file in a pipenv project 【发布时间】:2018-07-05 04:55:58 【问题描述】:我一直在使用 pipenv 制作一个 python 项目,我希望能够从我的 (linux) 系统上的任何位置在终端中运行它。 具体来说,假设我有以下目录结构:
/home
/project
Pipfile
main.py
/other_dir
我希望能够创建一个别名,让我可以像这样调用main.py
:
/home/other_dir$ alias_to_my_proyect --some args
并在虚拟环境中运行它,具有与
相同的行为/home/project$ pipenv run python main.py
但在另一个目录中。
如果不是 pipenv 项目,我只会在文件的开头使用 shebang,然后在我的 .bashrc 中为其添加别名,但我想使用 pipenv 的虚拟环境,但我找不到一种使用 pipenv 的方法。
【问题讨论】:
能否编辑 main.py 并添加:#!/usr/bin/env pipenv run python
然后使 main.py 可执行并直接调用它?
@match 我得到/usr/bin/env: ‘pipenv run python’: No such file or directory
【参考方案1】:
如果您想为您的脚本使用特定的 python 环境,您需要将其指向该环境的解释器。在 Mac 上,默认是 pipenv
将所有 virtualenvs 安装到 /Users/<user_name>/.local/share/virtualenvs/
但是可以将其设置为不同的位置 described in the manual:
如果你设置了 WORKON_HOME 环境变量,Pipenv 会自动接受它——所以你可以告诉 pipenv 将你的虚拟环境存储在你想要的任何地方,例如:
export WORKON_HOME=~/.venvs
此外,您还可以通过设置 PIPENV_VENV_IN_PROJECT 环境变量让 Pipenv 将 virtualenv 粘贴到 project/.venv 中。
您可以通过项目文件夹中的pipenv --venv
找到 virtualenv 的确切位置。它返回类似/Users/reedef/.local/share/virtualenvs/project-BpR9WgCa
的内容。解释器位于该位置的./bin/python
。
如果我们假设您没有设置任何环境变量并且您使用的是 Mac,那么这意味着您可以编写脚本:
#!/usr/bin/env sh
/Users/reedef/.local/share/virtualenvs/project-BpR9WgCa/bin/python /home/project/main.py
并将其放在 $PATH 中的某个位置,例如/usr/local/bin/my_fancy_main
让它在特定环境中运行。
注意:正如@Jon 在 cmets 中提到的,路径末尾的-BpR9WgCa
是稳定的,因为它是is made from the project path:
hash = hashlib.sha256(location.encode()).digest()[:6]
只要项目路径没有改变就应该是一样的。
【讨论】:
据我所知,哈希是稳定的,因为它是由项目路径生成的。只要项目路径没有改变,它就应该是相同的。 source【参考方案2】:你可以使用
#!/usr/bin/env pipenv-shebang
在你安装我的pipenv-shebang 包后在你的脚本中:
pip install pipenv-shebang
【讨论】:
【参考方案3】:您应该使用标准的setuptools 库到write a setup.py
file。特别是你可以write an entry_points
section 来命名你的主脚本:
entry_points=
'console_scripts': [
'alias_to_my_project = project.main.main'
]
完成此操作后,您可以激活包并将其安装到虚拟环境中
pipenv install -e .
# or without pipenv
. ~/vpy/bin/activate
pip install -e .
这将在$VIRTUAL_ENV/bin/alias_to_my_project
中创建一个包装脚本,该脚本加载project.main
Python 模块并调用其main
函数。
包装脚本知道虚拟环境,可以直接调用,无需专门激活虚拟环境。所以你可以做类似的事情
ln -s $VIRTUAL_ENV/bin/alias_to_my_project $HOME/bin/alias_to_my_project
PATH=$HOME/bin:$PATH
而且它总是可用的。
【讨论】:
以上是关于在 pipenv 项目中为 python 文件创建命令行别名的主要内容,如果未能解决你的问题,请参考以下文章