Почему мой код может использовать Python установленной моей ОС, когда я работаю в виртуальной среде? - PullRequest
0 голосов
/ 08 мая 2020

Я слежу за за книгой , которая вводит Django и в то же время учит TDD для Python.

Стадия, на которой я нахожусь, пытается использовать POP для получения электронного письма (отправленного на адрес yahoo.com) с целью изучения его содержимого.

Я запускаю все в виртуальной среде на моем локальном компьютере (который выполняет тесты на удаленном сервере, в в моем случае VPS, размещенный Hostinger). Нам только что сказали сделать это на локальном компьютере (на самом деле source это из локального файла .env):

YAHOO_PASSWORD=myYahooPassword

Ошибка, которую это дает, выглядит следующим образом:

(test_venv369) mike@M17A ~/IdeaProjects/TestingGoat $ STAGING_SERVER=mikerodentstaging.xyz python manage.py test functional_tests.test_login
...
ERROR: test_can_get_email_link_to_log_in (functional_tests.test_login.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/mike/IdeaProjects/TestingGoat/functional_tests/test_login.py", line 72, in test_can_get_email_link_to_log_in
body = self.wait_for_email( test_email, SUBJECT )
File "/home/mike/IdeaProjects/TestingGoat/functional_tests/test_login.py", line 28, in wait_for_email
inbox.pass_(os.environ['YAHOO_PASSWORD'])
File "/usr/lib/python3.6/os.py", line 669, in __getitem__
raise KeyError(key) from None
KeyError: 'YAHOO_PASSWORD'

... и мой первый озадаченный ответ был: экспортировать переменную, вместо того, чтобы оставить ее как неэкспортируемую. Это дало еще одну ошибку: FT завис (!) Примерно на 60 с, прежде чем закончился так:

ERROR: test_can_get_email_link_to_log_in (functional_tests.test_login.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/mike/IdeaProjects/TestingGoat/functional_tests/test_login.py", line 72, in test_can_get_email_link_to_log_in
body = self.wait_for_email( test_email, SUBJECT )
File "/home/mike/IdeaProjects/TestingGoat/functional_tests/test_login.py", line 28, in wait_for_email
inbox.pass_(os.environ['YAHOO_PASSWORD'])
File "/usr/lib/python3.6/poplib.py", line 213, in pass_
return self._shortcmd('PASS %s' % pswd)
File "/usr/lib/python3.6/poplib.py", line 176, in _shortcmd
return self._getresp()
File "/usr/lib/python3.6/poplib.py", line 152, in _getresp
raise error_proto(resp)
poplib.error_proto: b'-ERR [SYS/TEMP] Server error - Please try again later.'

... что я заметил странным в обеих этих трассировках, так это то, что они используют мою локальную установка на машине Python установка, несмотря на то, что я работаю из виртуальной среды.

Почему это могло произойти? Возможно, это потому, что мне не удалось установить один или несколько модулей в моей виртуальной среде, возможно, я использовал pip? Это особенно странно в случае модуля os, который, как я полагаю, присутствует в моей настройке виртуальной среды как стандарт. Сказав это, я на самом деле не могу найти такой файл os.py:

mike@M17A ~/python_venvs/test_venv369 $  find . -regex '.*/os.py'

Между прочим, сам тестовый код довольно длинный, поэтому я до сих пор не цитировал его .. . это отрывок задействованного кода (строка os.environ[ ... ] находится примерно на полпути):

from django.core import mail
from selenium.webdriver.common.keys import Keys
import os
import poplib
import re
import time
from .base import FunctionalTest

SUBJECT = 'Your login link for Superlists'

class LoginTest(FunctionalTest):
    def wait_for_email(self, test_email, subject):
        if not self.staging_server:
            email = mail.outbox[0]
            self.assertIn(test_email, email.to)
            self.assertEqual(email.subject, subject)
            return email.body
        email_id = None
        start = time.time()
        inbox = poplib.POP3_SSL('pop.mail.yahoo.com')
        try:
            inbox.user(test_email)
            inbox.pass_(os.environ['YAHOO_PASSWORD'])
            while time.time() - start < 60:
                # get 10 newest messages
                count, _ = inbox.stat()
                for i in reversed(range(max(1, count - 10), count + 1)):
                    print('getting msg', i)
                    _, lines, __ = inbox.retr(i)
                    lines = [l.decode('utf8') for l in lines]
                    # print(lines)
                    if f'Subject: {subject}' in lines:
                        email_id = i
                        body = '\n'.join(lines)
                        return body
                time.sleep(5)
        finally:
            if email_id:
                inbox.dele(email_id)
            inbox.quit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...