我正在尝试运行一个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
答案 0 :(得分:0)
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支持编译的套接字模块)。 如果未指定host,则使用”(本地主机)。如果省略端口,则使用标准的IMAP4-over-SSL端口(993)。 ssl_context是ssl.SSLContext对象,该对象允许将SSL配置选项,证书和私钥绑定到单个(可能长期存在)的结构中。请阅读安全注意事项以获取最佳做法。
密钥文件和certfile是ssl_context的传统替代方案-它们可以指向PEM格式的私钥和证书链文件以进行SSL连接。请注意,密钥文件/证书文件参数与ssl_context互斥,如果将密钥文件/证书文件与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证书。
编辑2:
您必须为python和文件使用完整路径。您可以从which python命令中找到前者,最有可能输出'/ usr / bin / python'并且您应该已经知道了后者。因此您的命令应如下所示:
$mystring = exec('/usr/bin/python /home/user/testing.py');
并且您应该确保您的python脚本具有所有适当的权限,因为您的网络服务器很可能以其他用户身份运行,因此权限应为“ -rwxrwxr-x”或其他内容。