Bash против CMD при использовании imaplib - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь запустить скрипт php, который вызовет скрипт python, который вызывает imaplib, чтобы извлечь некоторые файлы из моей электронной почты. Когда я запускаю скрипт на Python автономно в vscode (терминал bash), он работает как задумано. Когда я запускаю скрипт PHP, который вызывает скрипт python, выдается следующая ошибка.

Traceback (most recent call last):
  File "C:/xampp/htdocs/report/pythonfile/parse_script_og.py", line 43, in <module>
    mail = imaplib.IMAP4_SSL('imap.googlemail.com')
AttributeError: module 'imaplib' has no attribute 'IMAP4_SSL'

В качестве теста я повторил команду и вставил ее в Git Bash. Файлы были извлечены и добавлены в указанную папку. Когда я вставил команду в CMD, появилась ошибка выше. Какие настройки мне не хватает?

Я использую XAMPP, VSCode, PHP 7.3.4, Python 3.7.1

Из рекомендации ниже я добавил "import ssl" в свой скрипт на python и получил следующую ошибку:

"Traceback (most recent call last):"
"  File "C:/xampp/htdocs/report/pythonfile/parse_script_og.py", line 2, in <module>"
"    import ssl"
"  File "C:\Users\Garrett\Anaconda3\envs\snowflakes\lib\ssl.py", line 98, in <module>"
"    import _ssl             # if we can't import it, let the error propagate"
"ImportError: DLL load failed: The specified module could not be found."

Итак, я пошел в свою среду Python и попытался "pip install ssl", и я получил следующую ошибку.

(snowflakes) C:\Users\Garrett>pip install ssl
Collecting ssl
  Using cached https://files.pythonhosted.org/packages/83/21/f469c9923235f8c36d5fd5334ed11e2681abad7e0032c5aba964dcaf9bbb/ssl-1.16.tar.gz
    ERROR: Complete output from command python setup.py egg_info:
    ERROR: Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\Garrett\AppData\Local\Temp\pip-install-abzxmk8x\ssl\setup.py", line 33
        print 'looking for', f
                          ^
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print('looking for', f)?
    ----------------------------------------
ERROR: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Garrett\AppData\Local\Temp\pip-install-abzxmk8x\ssl\

(snowflakes) C:\Users\Garrett>

Другое обновление

Следующая команда выполняется в PHP (exec ()). Входная папка будет содержать файлы, извлеченные из электронной почты. Выходная папка будет содержать отдельный файл, созданный из файлов, извлеченных из электронной почты. Если я вставлю эту команду в GitBash, все будет работать как запланировано. Если я вставлю следующую команду в CMD, я получу ошибку, показанную выше.

C:/Users/Garrett/Anaconda3/python.exe C:/xampp/htdocs/report/pythonfile/parse_script_og.py C:/xampp/htdocs/report/input/ C:/xampp/htdocs/report/output/out.csv John Doe 06-Jan-2018 16-Jan-2019

1 Ответ

0 голосов
/ 24 мая 2019

IMAP4_SSL присутствует, только если доступен ssl-модуль Python (вы можете протестировать с помощью import ssl). Попробуйте обновить версию Python вашего сервера и / или установить модуль ssl.

https://docs.python.org/3/library/ssl.html

РЕДАКТИРОВАТЬ 1:

Существует также подкласс для безопасных соединений:

class imaplib.IMAP4_SSL (host = '', port = IMAP4_SSL_PORT, keyfile = None, certfile = None, ssl_context = None)

Это подкласс, производный от IMAP4, который подключается через сокет с шифрованием SSL (для использования этого класса вам нужен модуль сокета, который был скомпилирован с поддержкой SSL). Если хост не указан, используется '' (локальный хост). Если порт не указан, используется стандартный порт IMAP4-over-SSL (993). ssl_context - это объект ssl.SSLContext, который позволяет объединить параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру. Пожалуйста, ознакомьтесь с соображениями безопасности для передового опыта.

keyfile и certfile являются устаревшей альтернативой ssl_context - они могут указывать на файлы закрытого ключа в формате PEM и цепочку сертификатов для соединения SSL. Обратите внимание, что параметры keyfile / certfile являются взаимоисключающими с ssl_context, ValueError генерируется, если ключевой файл / certfile предоставляется вместе с ssl_context.

Изменено в версии 3.3: добавлен параметр ssl_context.

Изменено в версии 3.4: теперь класс поддерживает проверку имени хоста с помощью ssl.SSLContext.check_hostname и индикации имени сервера (см. Ssl.HAS_SNI).

Не рекомендуется с версии 3.6: файл ключей и файл сертификатов устарели в пользу ssl_context. Пожалуйста, используйте взамен ssl.SSLContext.load_cert_chain () или позвольте ssl.create_default_context () выбрать для вас доверенные сертификаты ЦС системы.

https://docs.python.org/3/library/imaplib.html

РЕДАКТИРОВАТЬ 2:

вы должны использовать полный путь для питона и для вашего файла. вы можете найти первый из команды which python, который, скорее всего, выведет «/ usr / bin / python», и вы уже должны знать последний. поэтому ваша команда будет выглядеть так:

$mystring = exec('/usr/bin/python /home/user/testing.py');

и вы должны убедиться, что ваш скрипт Python имеет все соответствующие разрешения, поскольку ваш веб-сервер, скорее всего, работает от имени другого пользователя, поэтому разрешения должны быть "-rwxrwxr-x" или что-то близкое.

Сбой Python-скрипта из PHP exec ()

...