草庐IT

python - 在 Apache2 中执行 Python 脚本

coder 2023-08-15 原文

我正在尝试使用 Apache 执行 Python 程序。但是,Apache 只会提供文件,而不会实际执行它。该文件的权限为 r/w/x,位于 /var/www 中。 httpd.conf的内容和后面的程序代码我会贴出来。我还尝试将 python 脚本作为 .cgi 文件运行,但效果不佳。我也将 mod_pythonmod_wsgi 模块加载到 apache 中。

Python 示例:

#!/usr/bin/python

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

httpd.conf:

AddHandler cgi-script .cgi .pl
AddHandler python-program .py

我知道它是一个很小的 ​​httpd.conf 文件,但是当我安装 apache 时,文件中没有任何内容。我还应该提到,这只是为了让我学习在 apache 中运行 python 的基础知识。它不适用于生产。 感谢您的帮助!

编辑

我使用的操作系统是 Ubuntu 10.04,apache 版本是 2。我有 python 版本 2.6,当调用 #!/usr/bin/env python 时会自动使用它。< br/=""> 我遇到两个主要错误,第一个是即使文件和文件夹的权限为 777,也找不到文件。日志中的错误是

[Sun Feb 05 13:29:44 2012] [error] [client 192.168.1.3] File does not exist: /var/www/poit-0.1

此错误是针对我未编写的不同 python 脚本。奇怪的是,当从浏览器窗口访问时,该文件显示在文件夹的索引中。但是,当我导航到该文件时,出现上述错误。

我遇到的另一个错误是 header 过早结束。错误如下:

[Sun Feb 05 12:10:19 2012] [error] (8)Exec format error: exec of '/var/www/pyth.py' failed
[Sun Feb 05 12:10:19 2012] [error] [client 192.168.1.3] Premature end of script headers: pyth.py

最佳答案

httpd.conf 的第一行:AddHandler cgi-script .cgi .pl 是无关紧要的,因为您正在测试 python 脚本而不是 perl 脚本。您应该在 python 脚本的位置定义这些指令,并告诉 apache 它应该在该位置执行 cgi 脚本:Options +ExecCGI。这个片段将是一个开始:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
</Directory>

附录 1:

根据我的上一条评论,试试这个脚本。它应该吐出有关 cgi 环境的信息。

#!/usr/bin/python
import cgi
cgi.test()

附录 2:

我得到了你的脚本来处理上面的配置。问题是脚本是用 python2 编写的。并且默认的解释器 apache 调用来执行脚本,是 python3(至少在我的情况下,这对你来说可能也是一样的)。

这是 hello world 脚本的 python3 版本:

#!/usr/bin/env python

# enable debugging
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

附录 3:

对于第一个错误,请确保正确设置了您尝试部署的目录和文件的权限和所有权。并尝试将这些指令添加到 httpd.conf:

Order allow,deny
Allow from all

这会让你得到这个:

<Directory /path/to/sample.py />
  Options +ExecCGI
  AddHandler cgi-script .py
  Order allow,deny
  Allow from all
</Directory>

对于第二个错误,除非我遗漏了什么,否则 apache 似乎正在调用 python 3 解释器来执行您的脚本。要排除这种可能性,您可以尝试以下操作:

ls -al /usr/bin/python*

这将列出您系统上可用的 python 解释器。如果您有多个解释器,您将得到类似于此输出的内容:

/usr/bin/python -> python3*
/usr/bin/python2.6*  
/usr/bin/python3*  

如果不是,则输出为:

/usr/bin/python -> python2.6*
/usr/bin/python2.6*  

为确保这不是您遇到的问题,请尝试使用此修改后的示例脚本:

#!/usr/bin/python2.6

# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/plain\r\n\r\n"
print

print "Hello World!"

您会注意到我明确提到了 apache 应该调用的解释器版本,这很丑陋。但是为了测试,你可以这样做。当然,您应该将 #!/usr/bin/python2.6 映射到您服务器上的任何二进制文件,并确保您不要将 python 3 可兼容代码与 python 2 解释器混合使用,反之亦然反之亦然。

关于python - 在 Apache2 中执行 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145517/

有关python - 在 Apache2 中执行 Python 脚本的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  4. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  5. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  6. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

随机推荐