web-dev-qa-db-ja.com

bashスクリプト内でvirtualenvをアクティブ化してプロンプトをアクティブにする方法

ツールをセットアップするだけでなく、プロンプトの仮想環境をそのまま保持するスクリプトが必要です。ただし、以下でheemaylが指摘しているように、シェルスクリプトは、実行されるとサブシェルで実行され、実行が完了するとすべてのパラメーターと環境が範囲外になります。今、私は考えています、最良の方法は、スクリプトから新しいターミナルウィンドウを開き、スクリプトにsource activateコマンドを新しいターミナルに「送信」させることです。詳細は次のとおりですが、ツールをセットアップして仮想envプロンプトのままにする方法はありますか?

私のプロジェクトの多く、つまり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シェルに落ちました。しかし、私が望むのは、上記のスクリプトではなくsource activateコマンドを実行したかのように、プロンプト(つまり(virtualenv)me @ mine:〜$)を表示することです。

これはXYの問題のような匂いがします。しかし、文脈がなければ、私の質問が不明確になるのではないかと心配しました。最後に、仮想環境を備えた端末を提供するスクリプトの作成方法を尋ねています。はい、私はこれを行うことができます:

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

可能な解決策

シェルスクリプトを使用して、私が考えている新しいターミナルウィンドウを開くことはできますか。

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

...結果として2つのタブ/ウィンドウが作成され、1つはipythonを実行し、もう1つはvirtualenv bashにあります(たとえば、ipythonを停止せずにmanage.pyコマンドを実行できます)。

4
Rick Page

シェルスクリプトは、実行されるとサブシェルで実行され、実行が完了するとすべてのパラメーターと環境が範囲外になります。

現在のシェルセッションで環境を使用可能にするには、source itする必要があります。

source /path/to/script.sh

副次的な注意として、ターミナルプロンプトへのアクセスを取り戻している間、何らかのブロッキングプロセスをバックグラウンドで動作させたい場合は、プロセスをバックグラウンドに送信します。

some_command_to_run_in_background &
3
heemayl

私は同じケースに直面しているので、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
Sebo.PL

これはあなたが求めたものではありませんが、あなたに役立つかもしれないと思います。

どこからでも仮想環境をアクティブ化する最も簡単な方法:

開発者向けメモ:-virtなど、1つのフォルダーにすべてのvirtualenvを作成する必要があります。

Virtualenvフォルダー名がvirtであると仮定します(変更しない場合)

cd
mkdir custom

Nanoをインストールするには、以下のコマンドを使用するか、お気に入りのエディターを使用します

Sudo apt-get install 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

あなたはvirtualenvをアクティブにしました...

0
SR_Mehta

Venvは、アクティブ化せずに使用できます。

Venv内のpythonインタープリターへのフルパスと、venv内にある実行するプログラムへのフルパスを指定する必要があります。

例として、venvにインストールされ、シェルスクリプトから実行されるAmazon aws cliコマンドを実行する次のバックアップスクリプトを参照してください。

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/
0
Duke Dougal