3

我一直在使用 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 执行此操作。

4

3 回答 3

1

如果你想为你的脚本使用一个特定的 python 环境,你需要将它指向那个环境的解释器。在 Mac 上,默认情况下pipenv将所有 virtualenvs 安装到,/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]

只要项目路径没有改变,它就应该是一样的。

于 2018-01-25T21:19:39.313 回答
1

你可以使用

#!/usr/bin/env pipenv-shebang

在你安装我的pipenv-shebang包后在你的脚本中:

pip install pipenv-shebang
于 2019-07-23T20:25:17.020 回答
0

您应该使用标准的setuptools库来编写setup.py文件。特别是,您可以编写一个命名您的主脚本的entry_points部分

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.mainPython 模块并调用其main函数。

包装脚本了解虚拟环境,无需专门激活虚拟环境即可直接调用。所以你可以做类似的事情

ln -s $VIRTUAL_ENV/bin/alias_to_my_project $HOME/bin/alias_to_my_project
PATH=$HOME/bin:$PATH

它总是可用的。

于 2018-08-22T11:36:49.843 回答