在 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 文件创建命令行别名的主要内容,如果未能解决你的问题,请参考以下文章

pipenv

pipenv快速入门

python虚拟环境--pipenv的使用

python 包管理工具Pipenv

跨平台 Pipenv.lock

python_flask小项目实例