Virtualenv не указывает на исправление python3 - PullRequest
1 голос
/ 11 января 2020

С помощью сценария bash я создал виртуальную среду для своего проекта, сценарий bash сохраняется в том же каталоге, что и проект:

#!/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

После запуска сценария я активирую среда, использующая

source ~/virtual_environments/invest_scripts/bin/activate

Но я получаю следующие выходные данные

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

Кроме того, я обнаружил, что при открытии интерактивной оболочки python3, когда виртуальная среда не активирована и импортируйте пакет, указанный в setup.py. Файл указывает на яйцо, показанное в моем проекте.

$ 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'

Может ли кто-нибудь объяснить, что происходит?

1 Ответ

2 голосов
/ 11 января 2020

sudo выполняет команды, используя новую оболочку, она не копируется в переменную окружения PATH. Это не проблема, указав c до virtualenv с. См. https://unix.stackexchange.com/questions/83191/how-to-make-sudo-preserve-path для общего решения c для этого.

Однако вам не нужно полагаться на исполняемое разрешение оболочки. Активация virtualenv, по сути, просто устанавливает переменную PATH, чтобы ваша оболочка сначала находила $env_dir/bin/python, когда вы используете неквалифицированный исполняемый файл python. Вы можете просто использовать полный путь к исполняемому файлу $env_dir/bin/python и, таким образом, полностью обходить поиск исполняемых файлов:

sudo $env_dir/bin/python setup.py install

Однако вы, как правило, не хотите переключать пользователей при установке пакетов в virtualenv, особенно root. Там не должно быть никакой необходимости. Если у вас есть проблемы с разрешением в вашем virtualenv , то вы использовали sudo в прошлом с ним, и вы не хотите, чтобы эта проблема усугублялась. В этом случае восстановите ваши полномочия virtualenv , рекурсивно переназначив файлы для своей учетной записи: sudo chown -R $UID:`id -g` $env_dir.

Далее, вместо использования setup.py install, используйте pip, чтобы сделать установка. Просто используйте команду pip в virtualenv и укажите каталог, содержащий файл setup.py. Если это текущий каталог, используйте:

$env_dir/bin/pip .
...