Mac端末からpythonでサーバーをセットアップしようとしています。
使用するフォルダーの場所に移動します。
python -m SimpleHTTPServer
しかし、これは私にエラーを与えます:
socket.error: [Errno 48] Address already in use
以前、マシンの別の場所にある別の Web サイトに対して同じコマンドを使用して接続を開いていました。
Mac端末からpythonでサーバーをセットアップしようとしています。
使用するフォルダーの場所に移動します。
python -m SimpleHTTPServer
しかし、これは私にエラーを与えます:
socket.error: [Errno 48] Address already in use
以前、マシンの別の場所にある別の Web サイトに対して同じコマンドを使用して接続を開いていました。
デフォルトのポート (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 以上の任意の数値を指定できます。
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 は、独自の試行、試行、再試行のアプローチを持っていません。
私はラズベリーパイを持っていて、Python Webサーバーを使用しています(Flaskを使用)。上記のすべてを試しましたが、唯一の解決策は、ターミナル(シェル)を閉じてから再度開くことです。または、そのウェブサーバーを停止するものがないため、raspberry pi を再起動します...
これは、すべての開発者にとって一般的に発生するユース ケースです。
ローカルシステムで機能するようにすることをお勧めします。(ユーザー設定に基づいて、このスクリプトを ksh/zsh や bash プロファイルなどのシェル プロファイルのいずれかに保持することをお勧めします)
function killport {
kill -9 `lsof -i tcp:"$1" | grep LISTEN | awk '{print $2}'`
}
使用法:
killport port_number
例:
killport 8080