- 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/
在流处理方面,Apache Beam和Apache Kafka之间有什么区别? 我也试图掌握技术和程序上的差异。 请通过您的经验报告来帮助我理解。 最佳答案 Beam是一种API,它以一种统一的方式使
有点n00b的问题。 如果我使用 Apache Ignite 进行消息传递和事件处理,是否还需要使用 Kafka? 与 Ignite 相比,Kafka 基本上会给我哪些(如果有的话)额外功能? 提前致
Apache MetaModel 是一个数据访问框架,它为发现、探索和查询不同类型的数据源提供了一个通用接口(interface)。 Apache Drill 是一种无架构的 SQL 查询引擎,它通过
Tomcat是一个广泛使用的java web服务器,而Apache也是一个web服务器,它们在实际项目使用中有什么不同? 经过一些研究,我有了一个简单的想法,比如, Apache Tomcat Ja
既然简单地使用 Apache 就足以运行许多 Web 应用程序,那么人们何时以及为什么除了 Apache 之外还使用 Tomcat? 最佳答案 Apache Tomcat是一个网络服务器和 Java
我在某个 VPS( friend 的带 cPanel 的 apache 服务器)上有一个帐户,我在那里有一个 public_html 目录。我们有大约 5-6 个网站: /home/myusernam
我目前正在尝试将模块加载到 Apache,使用 cmake 构建。该模块称为 mod_mapcache。它已成功构建并正确安装在/usr/lib/apache2/modules directroy 中
我对 url 中的问号有疑问。 例如:我有 url test.com/controller/action/part_1%3Fpart_2 (其中 %3F 是 url 编码的问号),并使用此重写规则:R
在同一台机器上,Apache 在端口 80 上运行,Tomcat 在端口 8080 上运行。 Apache 包括 html;css;js;文件并调用 tomcat 服务。 基本上 exampledom
Apache 1 和 Apache 2 的分支有什么区别? 使用一种或另一种的优点和缺点? 似乎 Apache 2 的缺点之一是使用大量内存,但也许它处理请求的速度更快? 最有趣的是 Apache 作
实际上,我们正在使用 Apache 网络服务器来托管我们的 REST-API。 脚本是用 Lua 编写的,并使用 mod-lua 映射。 例如来自 httpd.conf 的实际片段: [...] Lu
我在 apache 上的 ubuntu 中有一个虚拟主机,这不是我的主要配置,我有另一个网页作为我的主要网页,所以我想使用虚拟主机在同一个 IP 上设置这个。 urologyexpert.mx 是我的
我使用 Apache camel 已经很长时间了,发现它是满足各种系统集成相关业务需求的绝佳解决方案。但是几年前我遇到了 Apache Nifi 解决方案。经过一番谷歌搜索后,我发现虽然 Nifi 可
由于两者都是一次处理事件的流框架,这两种技术/流框架之间的核心架构差异是什么? 此外,在哪些特定用例中,一个比另一个更合适? 最佳答案 正如您所提到的,两者都是实时内存计算的流式平台。但是当您仔细观察
apache 文件(如 httpd.conf 和虚拟主机)中使用的语言名称是什么,例如 # Ensure that Apache listens on port 80 Listen 80 D
作为我学习过程的一部分,我认为如果我扩展更多关于 apache 的知识会很好。我有几个问题,虽然我知道有些内容可能需要相当冗长的解释,但我希望您能提供一个概述,以便我知道去哪里寻找。 (最好引用 mo
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4 个月前关闭。 Improve
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
这个问题在这里已经有了答案: Difference Between Apache Kafka and Camel (Broker vs Integration) (4 个回答) 3年前关闭。 据我所知
我有 2 个使用相同规则的子域,如下所示: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond
我是一名优秀的程序员,十分优秀!