在pipenv项目中为python文件制作命令行别名


问题内容

我一直在使用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
a文件的开头,然后在.bashrc中为其添加别名,但是我想使用pipenv的虚拟环境,但是我找不到方法用pipenv做到这一点。


问题答案:

如果要为脚本使用特定的python环境,则需要将其指向该环境的解释器。在Mac上,默认设置是pipenv将所有virtualenv安装到其中,/Users/<user_name>/.local/share/virtualenvs/但是可以如手册中所述将其设置为不同的位置:

如果已设置Pipenv,它将自动接受WORKON_HOME环境变量-因此,您可以告诉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在评论中提到的那样,-BpR9WgCa路径的末尾是稳定的,因为它是从项目路径生成的

hash = hashlib.sha256(location.encode()).digest()[:6]

只要项目路径没有更改,它就应该相同。