web-dev-qa-db-ja.com

シェルスクリプトを使用してVirtualEnvをアクティブ化しても機能しないようです

次のようなシェルスクリプトを使用してVirtualEnvをアクティブにしようとしましたが、動作しないようです。

#!/bin/sh
source ~/.virtualenvs/pinax-env/bin/activate

次のエラーが表示されます

$ sh virtualenv_activate.sh 
virtualenv_activate.sh: 2: source: not found

しかし、端末で同じコマンドを入力すると動作するようです

$ source ~/.virtualenvs/pinax-env/bin/activate
(pinax-env)gautam@Aspirebuntu:$

そこで、シェルスクリプトを

#!/bin/bash
source ~/.virtualenvs/pinax-env/bin/activate

提案および使用

$ bash virtualenv_activate.sh 
gautam@Aspirebuntu:$

スクリプトを実行します。

それはエラーをスローしませんが、仮想環境をアクティブにしません

この問題を解決する方法についての提案はありますか?

PS:私はUbuntu 11.04を使用しています

44
Gautam

TLDR

スクリプトだけではなく、sourceを使用して.shスクリプトを実行する必要があります

source your-script.sh

your-script.shではなく

詳細

shはbashとは異なります(一部のシステムは単にshをbashにリンクするため、shを実行すると実際にbashが実行されます)。 shはbashの骨抜きバージョンと考えることができます。 bashでshにないことの1つは、「ソース」コマンドです。このエラーが発生するのはこのためです。ソースはbashシェルで正常に実行されます。ただし、shを使用してスクリプトを開始すると、サブプロセスのシェルでスクリプトを実行します。このスクリプトはshで実行されているため、「ソース」は見つかりません。

解決策は、代わりにbashでスクリプトを実行することです。最初の行を...に変更します.

#!/bin/bash

次に実行...

./virtualenv_activate.sh

...または...

/bin/bash virtualenv_activate.sh

編集:

Virtualenvをアクティブにして、スクリプトを呼び出すシェルを変更する場合は、「ソース」または「ドット演算子」を使用する必要があります。これにより、スクリプトが現在のシェルで実行されます(したがって、現在の環境が変更されます)。

source virtualenv_activate.sh

...または...

. virtualenv_activate.sh

サイドノートとして、virtualenvが常に「ソース」を使用してアクティブ化スクリプトを実行する必要があると言っているのはこのためです。

60
Mark Hildreth

sourceはbashの組み込みシェルコマンドであり、shでは使用できません。私が正しく覚えている場合、仮想環境は多くのパスと環境変数の操作を行います。 bash virtualenv_blah.shとして実行しても動作しません。これは単にサブシェル内に環境を作成するだけだからです。

. virtualenv_activate.shまたはsource virtualenv_activate.shを試してください。これは基本的に現在の環境で実行するスクリプトを取得し、virtualenvのactivateによって変更されたすべての環境変数が利用可能になります。

HTH。

編集:ここに役立つリンクがあります- http://ss64.com/bash/period.html

7
arunkumar

Mac OS Xでは、提案は機能していないようです。

私はそれをこのようにした。私は解決策にあまり満足していませんが、とにかくそれをここで共有し、誰かがより良いものを提案することを願っています:

activate.sh 私が持っています

echo 'source /Users/andi/.virtualenvs/data_science/bin/activate'

実行許可を与える:chmod +x activate.sh

そして、私はこの方法を実行します:

`./activate.sh`

ASCII code 96 = `(グレイブアクセント)の形式の括弧が存在することに注意してください。

5
andilabs

私の場合、Ubuntu 16.04では、上記の方法がうまく機能しなかったか、多くの作業が必要です。

「アクティベート」スクリプトファイルのリンクを作成し、それをホームフォルダー(またはアクセス可能な$ PATHフォルダー)にコピーし、「actai」のような単純な名前に変更しました。

次に、ターミナルで「source actai」を呼び出します。出来た!

0
Jaeyoon Jeong