0

localhostで実行しようとしています。簡単な紹介。投稿前に読んだリンク: How to run Python CGI script How can I run Python CGI scripts on my web server? 最も正確: Python で記述された CGI スクリプトを実行するように apache サーバーを構成するためのヘルプが必要 また、公式http://httpd.apache.org/docs/1.3/misc/FAQ.html#CGIoutsideScriptAlias http://www.editrocket.com/記事/python_apache_windows.html およびその他...


.cgi および .py スクリプト用に Apache を構成するために提案されているすべての手順: 1)

libapache2-mod-wsgi をインストールします

[完了] 2) スクリプトが実行可能であり、Apache で使用できることを確認します ~$ ls -lah /var/www/cgi-bin/cgi101.py

-rwxrwxr-x 1 user user 318 2012-11-27 03:03 /var/www/cgi-bin/cgi101.py

3) /etc/apache2/sites-available/default[実際に更新]を編集:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
#   <Directory /var/www>
    <Directory /var/www/cgi-bin>
        Options Indexes FollowSymLinks MultiViews ExecCGI
        AllowOverride None
        Order allow,deny
        allow from all
        AddHandler cgi-script .cgi .py
#       AddHandler wsgi-script .wsgi
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

または

<Directory /var/www/cgi-bin>

次にApacheを再起動します

sudo /etc/init.d/apache2 restart

最後に、スクリプトを試してください。[実際に更新]のようなもの:

#!/usr/bin/python3

import cgi
form = cgi.FieldStorage()
# parse form data
print('Content-type: text/html\n')
# hdr plus blank line
print('<title>Reply Page</title>')
# html reply page
if not 'user' in form:
  print('<h1>Who are you?</h1>')
else:
  print('<h1>Hello <i>%s</i>!</h1>' % cgi.escape(form['user'].value))

私が得る出力で

404お探しのページが見つかりませんでした

エラー。え?と /var/www の両方を試しました。そしてpython3への私のpythonパス:

~$ ls -lah /usr/bin/python*
...
lrwxrwxrwx 1 root root    9 2011-10-05 23:53 /usr/bin/python3 -> python3.2
lrwxrwxrwx 1 root root   11 2012-10-20 06:17 /usr/bin/python3.2 -> python3.2mu
-rwxr-xr-x 1 root root 2.8M 2012-10-20 06:17 /usr/bin/python3.2mu
...

だから私は使う

#!/usr/bin/python3

前もって感謝します!


[更新] /var/log/apache2/error.log

[Tue Nov 27 13:47:56 2012] [error] [client 127.0.0.1] script not found or unable to stat: /usr/lib/cgi-bin/script.py, referer: http://localhost/cgi1$

/usr/lib/ で script.py を探すのはなぜですか??


更新】台詞を読みながら目を閉じた

 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">

/var/www/cgi-bin 内の実行可能な .cgi または .py へのパスである必要があります。エバートとみんなありがとう!

4

2 に答える 2

2

おそらく、スクリプトは にあります/var/www/cgi-bin/cgi101.py

しかし、あなたのApache設定にはこれがあります:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

AddHandlerそこにもディレクティブを追加します。

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
        AddHandler cgi-script .cgi .py
    </Directory>

(そしておそらく、/var/wwwディレクトリのこのセクションの上のセクションを削除します。)

次に、スクリプトを に置き、/usr/lib/cgi-bin/cgi101.pyもう一度やり直します。

Apacheのチュートリアルは、実際にはこれについてかなり明確に見えます。

于 2012-11-27T13:55:15.603 に答える
0

最初に、スクリプトが Python/OS で実行できることを確認する必要があります。あなたの場合、Python3 を使用しようとしましたが、古い形式のprint. Python3 の場合はprint()、関数として使用する必要があります。コマンドラインからスクリプトを実行しようとすると、スクリプトが実行される必要があります。execute属性があることを確認してください。

コマンド ラインからスクリプトを実行する場合は、CGI 経由でスクリプトを実行できます。http問題が発生した場合は、サーバーのログを確認してください。それらはおそらく入っているでしょうし/var/log/http、あるはずですerror.log。チェックしてください。

また、ファイルが unix タイプの EndOfLine を使用していることを確認してください。つまり、DOS/Windows の CRLF ではなく、LF のみを使用してください。CRLF を使用すると、最初の行 (シバン) が破損します。

また、空の行を使用して HTTP ヘッダーをコンテンツから分離する必要があります。だから代わりに

print("Content-Type: text/html")

使用する:

print("Content-Type: text/html\n")
于 2012-11-27T11:51:43.780 に答える