可能的解决方案

可能的解决方案

我想要一个脚本,它可以设置我的工具,但也能保持虚拟环境完整,以供提示。但是,正如 heemayl 在下面指出的那样,shell 脚本在执行时会在子 shell 中运行,并且一旦执行完成,所有参数和环境都会超出范围。现在我在想,最好的方法是从脚本中打开一个新的终端窗口,并让脚本“发送”一个source activate命令到新的终端。更多细节如下,但有没有办法设置我的工具并让我处于虚拟环境提示中?

当我开始着手许多项目(即使用 Django 的项目)时,我都会以同样的方式开始。这变成了下面的脚本。

#!/bin/bash
#0 cd into project
cd $WSGI

#1. Load the virtual env
. /path/to/virtualenvs/django1-8-py-3/bin/activate

#2. Open spyder or other IDEs
spyder3 &

#3. Run an interactive shell that runs the development server i.e.

ipython -m pdb manage.py runserver

这很好用,直到我需要退出 ipython 并进入激活的 bash。由于上面的脚本在退出 ipython 后已完成,因此我进入了普通的 ol shell。但我想要的是看到提示符,即 (virtualenv) me@mine:~$,就好像我运行了命令source activate而不是上面的脚本一样。

我知道这听起来像是一个 XY 问题。但是如果没有上下文,我担心我的问题会不清楚。我问的是,如何编写一个脚本,在脚本的最后为我提供一个带有虚拟环境的终端。是的,我可以这样做:

source acitvate
run my script
when done in ipython I'm still in virtual env

可能的解决方案

我是否可以使用 shell 脚本打开一个新的终端窗口?我想,有没有办法:

do the steps in my script first
then open a new terminal window
run activate in this window

...产生两个选项卡/窗口,一个运行 ipython,另一个在虚拟环境 bash 中(因此我可以在不停止 ipython 的情况下运行 manage.py 命令)。

答案1

当执行时,shell 脚本会在子 shell 中运行,并且一旦执行完成,所有参数和环境都会超出范围。

为了使环境在当前 shell 会话中可用,您需要source执行以下操作:

source /path/to/script.sh

附注:如果您希望某些阻塞进程在您重新获得终端提示符的访问权限时继续在后台运行,请将该进程发送到后台:

some_command_to_run_in_background &

答案2

当我面临同样的情况时,我发现将其放入子壳source acitvate.bashrc可能是一个很好的方向。

#!/bin/bash
#
# This is an example for https://askubuntu.com/a/1052868/847382
#
# Copyright 2018 (c) Sebastian Sawicki (0x52fb0d10)
#  OPENPGP4FPR:5691BED8E6CA579830842DD85CB361E552FB0D10
#
# Licence: https://creativecommons.org/licenses/by/4.0/
#

# Create temporary directory
TMPDIR="$(mktemp --directory)"
trap "echo 'INFO: Exited temporary shell.' >&2; rm --force --recursive '${TMPDIR}'" EXIT

# Set-up virtualenv in the temporary directory
virtualenv "${TMPDIR}"
. "${TMPDIR}/bin/activate"

# Install any required pip packages
[ -r "$(pwd)/pyReqs.txt" ] && pip install --requirement "$(pwd)/pyReqs.txt"

# Run a subshell with virtualenv already activated
bash --rcfile "${TMPDIR}/bin/activate" -i

答案3

您无需激活 venv 即可使用它。

您需要指定 venv 中 python 解释器的完整路径以及您想要运行的程序的完整路径(该程序也在 venv 中)。

作为示例,查看运行 Amazon aws cli 命令的备份脚本,该脚本安装到 venv 中,从 shell 脚本运行:

NOW=$(date +"%F-%H:%M:%S")
BACKUP_FILENAME="pg-dumpall-foo-$NOW.zip"
SCHEMA_FILENAME="pg-schema-foo-$NOW.zip"

cd ~
mkdir -p backup_tmp
cd backup_tmp
find . -type f -mmin +360 -delete
pg_dumpall -U postgres -h localhost | /bin/gzip -9 > $BACKUP_FILENAME
pg_dump -U postgres -h localhost -s foo  | /bin/gzip -9 > $SCHEMA_FILENAME
echo saving $BACKUP_FILENAME to s3
/opt/foo/venv3.6/bin/python /opt/foo/venv3.6/bin/aws s3 cp $BACKUP_FILENAME s3://foobackups/
echo saving $SCHEMA_FILENAME to s3
/opt/foo/venv3.6/bin/python /opt/foo/venv3.6/bin/aws s3 cp $SCHEMA_FILENAME s3://foobackups/

答案4

这不是您所要求的,但我认为它可能会对您有所帮助。

从任何地方激活虚拟环境的最简单方法:

开发者说明:- 您应该在一个文件夹中创建所有虚拟环境,例如virt

假设你的虚拟环境文件夹名称是virt(如果不是,请更改它)

cd
mkdir custom

要安装 nano,请使用以下命令或使用您最喜欢的编辑器

sudo apt-get install nano

要退出 nano,请按ctrl+x然后按y

nano custom/vhelper

添加以下行...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

授予您的文件执行权限

sudo chmod +x custom/vhelper

现在导出该自定义文件夹路径,以便您可以通过单击选项卡在命令行上找到它...

PATH=$PATH:"$HOME/custom"

现在您只需输入以下命令即可在任何地方使用它......

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

假设它是 abc 那么......

vhelper abc

恭喜您已激活虚拟环境...

相关内容