【问题标题】:Bash vs CMD when using imaplib使用 imaplib 时的 Bash 与 CMD
【发布时间】:2019-10-10 13:50:09
【问题描述】:

我正在尝试运行一个 php 脚本,该脚本将调用一个 python 脚本,该脚本调用 imaplib 从我的电子邮件中提取一些文件。当我在 vscode(bash 终端)中独立运行 python 脚本时,它按设计工作。当我运行调用python脚本的PHP脚本时,会产生以下错误。

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

根据下面的推荐,我在我的 python 脚本中添加了“import ssl”,我收到以下错误:

"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

【问题讨论】:

  • 我不得不问:当 PHP 有广泛的 IMAP functions 范围时,为什么要在 Python 中这样做?
  • 在团队中工作,这是我接棒的地方。不幸的是,现有代码在我当前的设置下无法在我的机器上运行。
  • 您的 PYTHONPATH 或类似的东西在运行时被修改了,并且找不到它的支持 DLL(例如,内部的 _ssl 模块)。
  • 我尝试对我的环境变量进行一些修改,但没有运气,再次更新正文以提供更多详细信息

标签: php python cmd git-bash imaplib


【解决方案1】:

IMAP4_SSL 仅在 Python 的 ssl 模块可用时才存在(您可以使用 import ssl 进行测试)。尝试升级服务器的 python 版本,和/或安装 ssl 模块。

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

编辑 1:

还有一个用于安全连接的子类:

类 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 的传统替代方案 - 它们可以指向用于 SSL 连接的 PEM 格式的私钥和证书链文件。请注意,keyfile/certfile 参数与 ssl_context 是互斥的,如果 keyfile/certfile 与 ssl_context 一起提供,则会引发 ValueError。

3.3 版更改:添加了 ssl_context 参数。

在 3.4 版中更改:该类现在支持使用 ssl.SSLContext.check_hostname 和服务器名称指示检查主机名(请参阅 ssl.HAS_SNI)。

自 3.6 版起已弃用:不推荐使用 keyfile 和 certfile 以支持 ssl_context。请使用 ssl.SSLContext.load_cert_chain() 代替,或让 ssl.create_default_context() 为您选择系统的可信 CA 证书。

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

编辑 2:

您必须为 python 和您的文件使用完整路径。您可能会从 which python 命令中找到前者,最有可能输出 '/usr/bin/python' 并且您应该已经知道后者。所以你的命令看起来像这样:

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

并且您应该确保您的 python 脚本具有所有适当的权限,因为您的网络服务器很可能以不同的用户身份运行,因此权限应该是“-rwxrwxr-x”或类似的。

Python Script Failing to Execute from PHP exec()

【讨论】:

  • 添加了当我在上面的 python 脚本中添加“import ssl”时发生的事情
  • 您确定可以正确安装模块吗?
  • 你能澄清一下吗?我已经尽我所能安装了所有东西
  • Python 带有 SSL。这不是您需要安装的东西。
  • exec() 在 PHP 中执行命令行参数,在我当前的设置中命令行不喜欢 ssl。我不清楚如何解决这个问题。我查看了上面的文档,当我在我的 python 脚本中尝试 import ssl 时,它产生了上面的错误。有一种方法可以在不显式导入 ssl 的情况下在 Windows 中运行它,但到目前为止这仍然是一个谜。
猜你喜欢
  • 2016-08-27
  • 2019-09-15
  • 1970-01-01
  • 2021-10-04
  • 2022-06-11
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多