Za pomocą skryptu bash utworzyłem wirtualne środowisko dla mojego projektu, skrypt bash jest przechowywany w tym samym katalogu co projekt:

#!/bin/bash

virtualenv=~/Library/Python/3.7/lib/python/site-packages/virtualenv.py
wd=$(dirname "$BASH_SOURCE")
env_dir=~/virtual_environments/invest_scripts
$virtualenv $env_dir

cd -- "$(dirname "$BASH_SOURCE")"
source $env_dir/bin/activate
sudo python3 setup.py develop
deactivate

Po uruchomieniu skryptu aktywuję środowisko za pomocą

source ~/virtual_environments/invest_scripts/bin/activate

Ale otrzymuję następujące dane wyjściowe

(invest_scripts) $which python
(invest_scripts) $/Users/name/virtual_environments/invest_scripts/bin/python
(invest_scripts) $which python3
(invest_scripts) $/usr/bin/python3

Dodatkowo odkryłem, że kiedy otwieram interaktywną powłokę python3, gdy środowisko wirtualne nie jest aktywowane, i importuję pakiet, który został określony w setup.py. Plik wskazuje na jajko pokazane w moim projekcie.

$ python3
Python 3.7.3 (default, Nov 15 2019, 04:04:52) 
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.__file__
'/Users/name/invest_scripts/.eggs/numpy-1.18.0-py3.7-macosx-10.7 x86_64.egg/numpy/__init__.py'

Czy ktoś mógłby wyjaśnić, co się dzieje?

1
Tian 11 styczeń 2020, 19:28

1 odpowiedź

Najlepsza odpowiedź

sudo Wykonuje polecenia za pomocą nowej powłoki, nie skopiuje na zmiennej środowiskowej {X1}}. To nie jest problem specyficzny dla virtualenv s. Zobacz https://unix.stackexchange.com/questions/83191/how-toto -Make-sudo-zachować ścieżkę dla ogólnego rozwiązania do tego.

Nie musisz jednak polegać na rozdzielczości wykonywalnej powłoki. Aktywacja VirtualenV zasadniczo Ustawia zmienną PATH, dzięki czemu skorupa znajdzie $env_dir/bin/python najpierw podczas korzystania z wykonywalnego wykonywania {x2}}. Możesz po prostu użyć pełnej ścieżki plików wykonywalnych $env_dir/bin/python i tak całkowicie wykonywalnych serwisów wykonawczych:

sudo $env_dir/bin/python setup.py install

Jednak zazwyczaj chcesz uniknąć przełączania użytkowników podczas instalowania pakietów do VirtualenV, zwłaszcza root. Nie powinno być żadnej potrzeby. Jeśli masz problemy z pozwoleniem w wirtualne , użyłeś z nim sudo w przeszłości, a nie chcesz złożyć ten problem. W takim przypadku napraw swoje uprawnienia VirtualenV rekurencyjnie przypisując pliki na własne konto: sudo chown -R $UID:`id -g` $env_dir.

Następnie, zamiast używać setup.py install, użyj pip, aby wykonać instalację. Wystarczy użyć polecenia pip w wirtualnym punkcie do katalogu zawierającego plik setup.py. Jeśli to obecny katalog, użyj:

$env_dir/bin/pip .
2
Martijn Pieters 11 styczeń 2020, 17:50