web-dev-qa-db-ja.com

python virtualenv bin内からのスクリプトが動作していません

グローバルに利用できるようにしたいスクリプトがあります。標準のハッシュバングで始めました:

#! /usr/bin/env python

そして、それを私のvirtualenvのbinディレクトリにリンクしました:

~/environments/project/env/bin/myscript

そして、そのディレクトリを私のパスに追加しました。コマンドを実行すると:

myscript

ライブラリの1つでインポートエラーが発生します。ただし、仮想環境をアクティブにしてスクリプトを実行すると、期待どおりに機能します。

シンボリックリンクの問題を除外しました(スクリプトをbinフォルダー内に移動するだけでも試しました)。私もPythonでスクリプトを実行しようとしました

python ~/environments/project/env/bin/myscript

以前は、環境をアクティブ化してからスクリプトを実行するスクリプトを使用していましたが、このフォルダーから実行されるスクリプトは、virtualenvのインタープリターとサイトパッケージで実行する必要があるという印象を受けました。これが機能しない理由や、これをデバッグできる方法についてのアイデアはありますか?

26
justin

スクリプトをvirtualenvのビンに入れてから、そのビンの場所をグローバルPATHに追加しても、virtualenvは自動的に取得されません。アクティブにするために最初にソースを取得する必要があります。

システムが知っているのは、実行可能ファイルの追加パスを確認して実行することだけです。そのスクリプトには、virtualenvを示すものは何もありません。

ただし、she-bang行をvirtualenv pythonにハードコードすることもできます。その場合、サイトパッケージはパス上に配置されます。

#!/Users/foo/environments/project/env/bin/python

または、元のpythonsスクリプトを呼び出す小さなbashラッパーを単純に作成することもできます。これにより、元のスクリプトを汎用のシバンで残すことができます。

Myscript.pyが次の場合:#!/usr/bin/env python ...

その後、myscriptを作成できます:

#!/bin/bash

/Users/foo/environments/project/env/bin/python myscript.py

myscriptを実行すると、セットアップしたインタープリターでpythonスクリプトを明示的に呼び出します。

46
jdi

Virtualenvの動作について混乱していると思います。

簡単に言えば、virtualenvはシェル環境を変更して、Pythonが異なる領域を調べてインポートするモジュールを見つけるようにします。仮想環境を保存する場所と必要に応じて、virtualenvを〜/ environments/my_envというディレクトリに保存し、virtualenvの使用中にコーディングしたすべてのソースを〜/ projects/my_projに保存できます。

virtulenvの機能 の詳細については、ドキュメントをご覧ください。

本当に、pythonモジュールの検索場所はpython( ドキュメントを参照 virtualenvをアクティブにすると、pythonの動作方法が変わります。

シェルスクリプトでvirtualenvをアクティブにすることに戻るか、または このレシピ に従ってスクリプトから直接アクティブにすることができます。

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

このルートを選択する場合、ドキュメントが提供する情報を覚えておいてください。

これにより、sys.pathとsys.prefixも変更されますが、既存のインタープリターを使用することもできます。環境内のアイテムは、グローバルアイテムの前にsys.pathに最初に表示されます。ただし、グローバルアイテムは常にアクセス可能です(環境の作成時に--system-site-packagesフラグが使用されたかどうかに関係なく)。また、他の環境のアクティベーション、またはインポートされたモジュールを元に戻すことはできません。たとえば、Webリクエストの前に環境をアクティブにしようとしないでください。 1つの環境をできるだけ早くアクティブにし、そのプロセスで再度アクティブにしないでください。

11
Mark Hildreth

代わりに相対パスを追加できませんでしたか?これは私のために働いた:

#!./env/bin/python
2
Carvaka

私は同じ問題に直面し、この解決策を思いつきました: https://github.com/jabbalaci/wpython 。ローカルのPythonインタープリターをvenvで使用してプログラムを呼び出す「wpython」というスクリプトです。したがって、「/Users/foo/environments/project/env/bin/python myscript.py」の代わりに「wpython /path/to/myscript.py "。ランチャースクリプトは次のようになります。

#!/usr/bin/env bash

cd /the/directory/where/myscript.py/is/located
wpython myscript.py
0
Jabba

ウィンドウを使用している場合は、pythonファイルの先頭に次の行を含めることができます。

#! P:\Workspace\pythontut\Scripts python
0
user1012513