Где связь между двумя средами Python venv

У меня есть две среды Python, и между ними есть какая-то связь.

/home/testapi/API25/env это оригинальный venv /home/preprodapi/API25/env был создан с помощью копии cpio с первого. Это работало найти в течение многих месяцев. Но теперь возникла проблема.

Симптом заключается в том, что в preprodapi пакет pytz не может найти часовой пояс Africa/Johannesburg (и, предположительно, другие), о чем свидетельствует трассировка стека:

 Traceback (most recent call last):
   File "/home/preprodapi/API25.8512/validator/echo.py", line 244, in jsonified_wrapper
    response_obj = request_handler(*args, **kwargs)
   File "/home/preprodapi/API25.8512/validator/echo.py", line 478, in bearer_token_wrapper
    return request_handler(*args, **kwargs)
   File "/home/preprodapi/API25.8512/validator/echo.py", line 1068, in globaldb_connection_wrapper
    return request_handler(*args, **kwargs)
   File "/home/preprodapi/API25.8512/validator/echo.py", line 569, in get_school_wrapper
    return request_handler(*args, **kwargs)
   File "/home/preprodapi/API25.8512/validator/echo.py", line 697, in school_admin_wrapper
    return request_handler(*args, **kwargs)
   File "/home/preprodapi/API25.8512/routehandlers.py", line 4035, in email_report
    do_email_report(kwargs.get('reportid'), json_attrs, getctx_school().get('schoolname'))
   File "/home/preprodapi/API25.8512/validator/echo.py", line 1155, in do_email_report
    tz = pytz.timezone(sender.school.get("local_timezone"))
   File "/home/testapi/API25/env/lib64/python3.5/site-packages/pytz/__init__.py", line 181, in timezone
 pytz.exceptions.UnknownTimeZoneError: 'Africa/Johannesburg'

Обратите внимание, как он переключается с /home/preprodapi/.... на /home/testapi/... в последнем элементе.

Но ПОЧЕМУ это происходит?

(env) [root@ip-172-31-8-200 API25]# deactivate
[root@ip-172-31-8-200 API25]# pwd
/home/preprodapi/API25
[root@ip-172-31-8-200 API25]# . env/bin/activate
(env) [root@ip-172-31-8-200 API25]# pip uninstall pytz
Uninstalling pytz-2017.2:
  Would remove:
    /home/testapi/API25/env/lib/python3.5/site-packages/pytz-2017.2.dist-info/*
    /home/testapi/API25/env/lib/python3.5/site-packages/pytz/*
Proceed (y/n)? n
(env) [root@ip-172-31-8-200 API25]# python
Python 3.5.5 (default, Feb  6 2018, 10:57:32) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pytz
>>> print(pytz.timezone('Africa/Johannesburg'))
Africa/Johannesburg

Для записи я не могу найти никаких программных ссылок между venv

(env) [root@ip-172-31-8-200 API25]# pwd
/home/preprodapi/API25
(env) [root@ip-172-31-8-200 API25]# find env -type l -ls
40549590    0 lrwxrwxrwx   1 root     root            3 Feb  4 12:54 env/lib64 -> lib
40549592    0 lrwxrwxrwx   1 root     root           15 Feb  4 12:54 env/bin/python3.5m -> /bin/python3.5m
40549593    0 lrwxrwxrwx   1 root     root           10 Feb  4 12:54 env/bin/python -> python3.5m
40549594    0 lrwxrwxrwx   1 root     root           10 Feb  4 12:54 env/bin/python3 -> python3.5m

Помогите, пожалуйста!

Примечание PS /home/preprodapi/API25.8512 — это cpio-копия /home/preprodapi/API25. Я получаю точно такие же результаты при тестировании в подкаталоге API25.8512.

Примечание № 2: То же самое не происходит с другим поставщиком на этом хосте.

[root@ip-172-31-8-200 API25.8512]# cd /home/apiuser
[root@ip-172-31-8-200 apiuser]# cd API25
[root@ip-172-31-8-200 API25]# . env/bin/activate
(env) [root@ip-172-31-8-200 API25]# pip uninstall pytz
Uninstalling pytz-2018.9:
  Would remove:
    /home/apiuser/API25/env/lib/python3.5/site-packages/pytz-2018.9.dist-info/*
    /home/apiuser/API25/env/lib/python3.5/site-packages/pytz/*
Proceed (y/n)? n

person The Tahaan    schedule 04.02.2019    source источник
comment
Что такое копия cpio? cpio это архиватор, а не утилита копирования.   -  person ivan_pozdeev    schedule 04.02.2019
comment
Не могли бы вы обновить свои примеры до минимально воспроизводимого примера? Без средств для воспроизведения проблемы невозможно с уверенностью сказать, в чем проблема. Например. то же самое произойдет, если вы создадите новый venv, установите в него какие-то пакеты, а затем скопируете его?   -  person ivan_pozdeev    schedule 04.02.2019
comment
Каково значение pytz.__file__ после того, как вы удалили pytz из текущей виртуальной среды?   -  person chepner    schedule 04.02.2019
comment
Что такое sys.path и PYTHONPATH? Вы уверены, что находитесь в правильном месте, когда происходит первая ошибка?   -  person ivan_pozdeev    schedule 05.02.2019
comment
cpio действительно очень мощная программа для копирования.   -  person The Tahaan    schedule 05.02.2019


Ответы (1)


Вам нужно проверить свой sys.path и найти источник аномалий, если они есть. См. Отладка изменений sys.path, чтобы узнать, как отслеживать изменения в sys.path и Могу ли я заархивировать все стандартные библиотеки Python, и Python все еще может их импортировать? для того, как он устроен.


venv реализован через стандарт Py3 site.py:

If a file named "pyvenv.cfg" exists one directory above sys.executable,
sys.prefix and sys.exec_prefix are set to that directory and
it is also checked for site-packages (sys.base_prefix and
sys.base_exec_prefix will always be the "real" prefixes of the Python
installation). If "pyvenv.cfg" (a bootstrap configuration file) contains
the key "include-system-site-packages" set to anything other than "false"
(case-insensitive), the system-level prefixes will still also be
searched for site-packages; otherwise they won't.

При создании venv python и ряд других файлов копируются в <venv>/bin (<venv\Scripts в Windows), а pyvenv.cfg помещается в <venv>, чтобы site.py мог найти его при запуске Python. activate добавляет <venv>/bin к PATH, чтобы локальный исполняемый файл запускался вместо системного при вводе "python".

В конечном итоге это приводит к sys.path, который сочетает общесистемную стандартную библиотеку с модулями сторонних производителей, специфичными для venv. Это будет выглядеть примерно так:

>>> sys.path
['', '<venv>/bin/python36.zip', <system Python platlib>, <system Python purelib>, '<venv>', '<venv>/lib/site-packages']

Таким образом, обычно не должно быть папок из другого venv в sys.path, вытекающих непосредственно из логики venv. Они могут быть результатом PYTHONPATH, некоторых файлов .pth или даже вашего собственного кода. Приведенная выше диагностика должна показать, откуда они берутся.

person ivan_pozdeev    schedule 05.02.2019
comment
Похоже, что решение заключается в том, что вы клонируете приложение Python, исключаете venv, создаете его заново и переустанавливаете эти пакеты из файла требований замораживания пакетов из исходного кода. У меня нет времени, чтобы проверить это должным образом прямо сейчас, но это имеет смысл, основываясь на моих выводах, поэтому я награждаю решение. - person The Tahaan; 05.02.2019