- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Windows Server 2019 VM 上运行 Apache2.4。 Apache 已设置好,因此我可以在我的 cgi-bin 脚本中使用 python。我有一个脚本可以执行
#!C:/Python39/python.exe
text = "This is some example text."
engine = pyttsx3.init("sapi5")
engine.save_to_file(text, "test.wav")
engine.runAndWait()
print("Content-type: audio/wav")
print()
with open("test.wav", "rb") as file:
print(file.read())
如果我从命令行调用该脚本,它会创建一个 115kb 的文件,其中包含我的文本的口语版本。但是,如果我通过网络浏览器调用相同的脚本(即浏览到 http://whatever/cgi-bin/test.py),它会创建一个 46b 文件,该文件似乎是一个有效的 WAV header ,但是没有实际数据——也就是说,它创建了一个有效的空声音文件。据我所知,我没有看到出现任何错误,既没有写入屏幕,也没有写入 Apache 的错误日志,也没有写入 Windows 日志。
(在我的本地网络上的 Windows 10 机器上运行 WAMP 时,相同的代码似乎有效。我还尝试安装 PHP 并让 Apache 使用它来调用 Python 是一个 shell 命令,这没有区别。(我不知道为什么我会这么认为!))
我怎样才能使它在 cgi/Apache 下像在命令行下一样工作?
我不知道这是否有用的信息,但这里是这些机器上安装的一些东西的版本(ETA,我已经尝试在 Windows 10 上升级以更好地匹配 Windows Server 2019):
Windows 10
HTTPD: 2.4.35 升级到 2.4.48,仍然有效
PHP:PHP Version 7.2.10(但在我的测试中Python被称为CGI,所以这应该无关紧要)升级到8.0.6,仍然有效
PYTHON:3.9.2rc1(tags/v3.9.2rc1:4064156,2021 年 2 月 17 日,11:25:18)[MSC v.1928 64 位 (AMD64)] 升级到 3.9。 6 (tags/v3.9.6:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 位 (AMD64)],仍然有效
.NET:运行“Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(? !S)\p{L}'} | 选择 PSChildName,版本"产生:
PSChildName Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.8.04084
Full 4.8.04084
Client 4.0.0.0
服务器 2019
HTTPD:2.4.48
PHP:PHP 版本 8.0.9(但在我的测试中 Python 被称为 CGI,所以这应该无关紧要)
Python:3.9.6(标签/v3.9.6:db3ff76,2021 年 6 月 28 日,15:26:21)[MSC v.1929 64 位 (AMD64)]
.NET:运行“Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(? !S)\p{L}'} | 选择 PSChildName,版本"产生:
PSChildName Version
----------- -------
v2.0.50727 2.0.50727.4927
v3.0 3.0.30729.4926
Windows Communication Foundation 3.0.4506.4926
Windows Presentation Foundation 3.0.6920.4902
v3.5 3.5.30729.4926
Client 4.8.03761
Full 4.8.03761
Client 4.0.0.0
使用 debug=True,在我看到的 Apache error_log 中
Traceback (most recent call last):
File "pyttsx3\\driver.py", line 90, in _pump
cmd[0](*cmd[1])
File "pyttsx3\\drivers\\sapi5.py", line 69, in save_to_file
temp_stream = self._tts.AudioOutputStream
_ctypes.COMError: (-2147200966, None, (None, None, None, 0, None))
-2147200966 似乎是 SPERR_NOT_FOUND,即“未找到请求的数据项(数据键、值等)。”
从 Apache 迁移到 IIS 并没有什么不同。
在系统设置中,我尝试允许应用程序访问任何与音频相关的内容。我使用 o&o ShutUp10++ 也允许我可以做的一切。这没有什么不同。
仍然通过 IIS 运行,使用 procmon64,我发现 python.exe 提示访问某些注册表项,并且它作为 IUSR 运行,所以我让 IUSR 完全控制 HKLM\Software\Microsoft\Speech 和 Speech_OneCore和 HKU.DEFAULT\Software\Microsoft 中的一样。我还读到我可能需要对 C:\windows\system32\config\systemprofile\appdata\roaming 的读取权限和/或 sysWOW64 中的系统配置文件,所以我也授予了 IUSR 对这两个文件的读取权限。
我仍然无法运行我的脚本。然而,我似乎已经更改了错误消息,现在是:
-2147221164, '类未注册', (None, None, None, 0, None))
最佳答案
您可以检查 cmd 中的 %PATH%
变量是否与作为 cgi 执行时在脚本中获得的变量匹配。
通过在命令行窗口中运行 set
获取 %PATH%
变量内容。通过添加
import sys
print(sys.path)
使用类似下面的语句将缺失的路径直接添加到您的脚本中
sys.path.append(r'C:\Python38-64\lib\site-packages\win32\lib')
尝试在您的脚本中添加如下内容。根据您在通过 cgi 运行时是否看到脚本输出,您可能希望将打印语句替换为日志语句。
try:
import pyttsx3.drivers.sapi5
except ImportError as e:
print('I could not import my driver')
else:
print('Driver imported')
同时尝试用espeak
替换sapi5
驱动
为初学者禁用 AV 和防火墙软件,然后重试。如果没有任何帮助,请尝试使用 netstat -natp | 查看 python 脚本(以 cmd 运行)使用了哪些端口。 findstr/I python
.从那里开始,在以 cgi 运行时重复并查看这些端口是否打开。
如果上述所有方法都失败,请尝试使用 IIS 运行您的 cgi,以区分问题是来自 apache 还是 Windows。
[编辑] 更新
尝试使用调试运行引擎以获取更多信息,例如 engine = pyttsx3.init("sapi5", debug=True)
不要忘记准备好 basicLogger 配置,以便正确进行调试。
如果您的 cgi 脚本不是线程安全的,您也可以尝试交换您的 apache MPM。为此,在 httpd/conf.modules.d
中找到一个名为 00-mpm.conf
的文件(或者通过搜索 grep/findstr mpd_mpm
找到 conf 文件)
您应该有 mpm_prefork 或 mpm_event(apache 2.4 中的默认设置)。某些 cgi 内容不能与 mpm_event 一起正常工作。尝试将其注释掉并改用 prefork。然后不要忘记重新启动apache。请注意,这会使 php-fpm 无法使用,但为了测试,它会有很大帮助。
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
[/编辑]
[编辑 2]通过调试,您现在知道您有错误 -2147200966,转换为 0x8004503A,在各个方向的点是:
您可以尝试停止 apache 服务,更改该服务使其作为系统运行,然后重试。或者,您可以停止该服务,启动 UAC 窗口,并尝试使用相应的配置文件从 bin 路径手动启动 apache。
极不可能,因为您的非 cgi 版本可以运行,但您可能需要重新安装引擎和语言包以确保所有组件都已正确注册
在控制面板中检查没有什么可以阻止麦克风/电话的使用。或者,您可以启动 o&oshutup10
以查看是否强制执行某些隐私设置(甚至可以是 GPO,因为您的环境是企业)
[/编辑 2]
关于python - 在 Windows Server 2019 上,通过 cgi/Apache 调用的 pyttsx3 生成空的 wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68591360/
嗨,我是一名学生,正在实习。不幸的是,我的公司要我用 C 编写 CGI 程序。我不知道他们为什么要使用它。无论如何,我必须在接下来的 2 个月内学习并应用它。我如何以及如何学习 CGI 编程。我有 2
CGI 脚本应该可以访问由 Web 服务器设置的环境变量列表。他们的名字是什么? 最佳答案 有关 CGI 规范,请参阅 RFC 3875,其中包含您需要的所有信息。 :-) 来自 RFC: met
CGI 是通用网关接口(interface)。顾名思义,它是所有事物的“通用”网关接口(interface)。从名字上看,它是如此琐碎和幼稚。我觉得我明白了这一点,每次遇到这个词都有这样的感觉。但坦白
我试图在 uhttpd 服务器 上执行 Cgi-Cpp 程序,该服务器运行 OpenWRT 安装。 Cgi 文件是 /www/cgi-bin/sample.cgi 并且也有执行权限。我正在尝试使用 H
我在目录下有一个 cpanel 帐户: /home/username/ 和一个文件: /home/username/public_html/ 这是index.php 其中包含:
我正在尝试修改我的 EasyPHP 以在 CGI 模式下运行。 根据此链接:http://www.easyvitools.com/phpserial/php_ser_reference.html我必须
有没有办法阻止 lighttpd 将 POST 缓冲到 CGI 可执行文件? 在我看来,所有请求在转发到 CGI 可执行文件之前都已完全缓冲在磁盘上,这使我无法以基于流的方式处理输入。 澄清一下,我只
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
这个问题在这里已经有了答案: Why does my system call to another CGI script work on the command line but not when
我正在设计一个应用程序,它将由 3-4 个服务组成,这些服务作为单独的进程运行并通过合适的 IPC 链接。该系统将有一个网络界面,我想使用那里的任何网络服务器。 应该在某个 URL 下访问 Web 界
这更多是为了理解 web 应用程序中的请求-响应机制。客户端向 Web 应用程序发送请求 (GET/POST)。 Web 应用程序有一个正在运行的应用程序服务器,该服务器用作应用程序特定程序的容器。我
这个问题在这里已经有了答案: Why does my system call to another CGI script work on the command line but not when
我遇到了这个问题:当我访问 URL“bobbabr.org”时,这是正常的,但是当我访问子域“ibobba.bobbabr.org”时,我被重定向到“/cgi-sys/defaultwebpage.c
我在虚拟机上运行的 Win 2k8 R2 上安装了 Mercurial 1.8.1、Python 2.6.6。我试过从 msi、源和使用 tortisehg 安装。命令行 Hg 工作正常,但在运行 h
我正在使用 cgi-bin 并显示一张 map ,其中包含来自 Postgres 数据库的一些数据。 但是,我需要引入一个输入,用户可以在其中选择一个日期,这个日期将从数据库中过滤结果。 我有输入并通
我目前正在尝试为我在带有 Ubuntu 的虚拟机上运行的实际本地网页创建一个简单的登录页面。 我创建了 LoginPage.html在位置 /var/www/html . 然后 HTML 文件调用 l
有谁知道如何配置 lighttpd 来处理普通的 CGI 可执行文件,在这种情况下是用 C 编写的?我已经编译了一个测试程序(test.cgi)并将它放在$HOME/public_html/cgi-b
我有一个 scriptA.cgi,它调用 scriptB.cgi。 scriptB.cgi 需要一个参数。 我都试过了在我尝试过的 scriptA.cgi 中: `perl -l scriptB.cg
我正在尝试让 Python、cgi 模块、ajax/javascript 组合工作。由于我的服务器访问的性质(基本上是租用的网站空间),我无法安装 django 或任何其他网络框架之类的东西。我现在坚
我在 Ubuntu 服务器上安装了标准的 Apache2。默认设置使用 ScriptAlias 将 /cgi-bin/ 引用到 /usr/lib/cgi-bin/。如果我将 Python CGI 脚本
我是一名优秀的程序员,十分优秀!