272

Mac端末からpythonでサーバーをセットアップしようとしています。

使用するフォルダーの場所に移動します。

python -m SimpleHTTPServer

しかし、これは私にエラーを与えます:

socket.error: [Errno 48] Address already in use

以前、マシンの別の場所にある別の Web サイトに対して同じコマンドを使用して接続を開いていました。

4

14 に答える 14

423

デフォルトのポート (8000) にバインドされたプロセスが既にあります。以前に同じモジュールを実行したことがある場合は、プロセスがまだポートにバインドされている可能性があります。最初に他のプロセスを見つけてみてください。

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

コマンド引数が含まれているため、SimpleHTTPServer複数のpythonプロセスがアクティブな場合に実行中のプロセスを見つけることができます。http://localhost:8000/ローカル ファイルのディレクトリ リストが引き続き表示されるかどうかをテストすることをお勧めします。

2 番目の数字はプロセス番号です。シグナルを送信してサーバーを停止します。

kill 81651

これにより、標準SIGTERMシグナルが送信されます。SIGKILLプロセスが応答しない場合は、代わりに(kill -s KILL <pid>またはkill -9 <pid>) シグナルを送信するなど、より厳しい方法に頼らなければならない場合があります。詳細については、ウィキペディアを参照してください

または、コマンド ラインで別のポートを指定して、のポートでサーバーを実行します。

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

次に、次のようにサーバーにアクセスしますhttp://localhost:8910。ポートが8910まだ使用されていない場合は、1024 以上の任意の数値を指定できます。

于 2013-09-28T20:54:37.300 に答える
8

Python で次のようなことを行うと、次に高い利用可能なポートでサービスを提供することもできます。

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

port = 8000
while True:
    try:
        httpd = SocketServer.TCPServer(('', port), Handler)
        print 'Serving on port', port
        httpd.serve_forever()
    except SocketServer.socket.error as exc:
        if exc.args[0] != 48:
            raise
        print 'Port', port, 'already in use'
        port += 1
    else:
        break

他のユーティリティで同じことを行う必要がある場合は、bash スクリプトの方が便利な場合があります。

#!/usr/bin/env bash

MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}

(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

その名前の実行可能ファイルとして設定すると、次のget-free-portようなことができます。

someprogram --port=$(get-free-port)

bashスクリプトはポートをキャプチャしないため、ネイティブのPythonアプローチほど信頼性は高くありません.別のプロセスがあなたのプロセスよりも前にポートを取得する可能性があります(競合状態). t は、独自の試行、試行、再試行のアプローチを持っていません。

于 2015-09-21T14:31:06.493 に答える
3

私はラズベリーパイを持っていて、Python Webサーバーを使用しています(Flaskを使用)。上記のすべてを試しましたが、唯一の解決策は、ターミナル(シェル)を閉じてから再度開くことです。または、そのウェブサーバーを停止するものがないため、raspberry pi を再起動します...

于 2018-07-26T09:21:43.350 に答える
0

これは、すべての開発者にとって一般的に発生するユース ケースです。

ローカルシステムで機能するようにすることをお勧めします。(ユーザー設定に基づいて、このスクリプトを ksh/zsh や bash プロファイルなどのシェル プロファイルのいずれかに保持することをお勧めします)

function killport {
   kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}

使用法:

killport port_number

例:

killport 8080
于 2021-02-19T18:41:36.507 に答える