erro CherryPy Olá Mundo
Pergunta
Quando eu estou correndo CherryPy Olá Mundo:
import cherrypy
class HelloWorld:
def index(self):
return "Hello world!"
index.exposed = True
cherrypy.config.update({'server.socket_port': 8080,})
cherrypy.quickstart(HelloWorld())
... fico com esta: IOError: Porto 8080 não ligado na 'localhost'. O que poderia ser?
Solução
Você provavelmente tem algo mais escuta nessa porta.
No Linux fazer:
netstat -pnl | grep 8080
E ver qual processo está escutando em 8080
No Windows use algo como TCPView a fazer o mesmo.
Outras dicas
Se você está tentando implantar CherryPy no Heroku, onde você não pode usar o auto-retorno para verificar se você realmente abriu uma porta, então você precisa para simplesmente desativar a função wait_for_occupied_port()
do CherryPy para que cheque auto-consistência do CherryPy não decidir que tem, de fato, falhou ao iniciar. Aqui estão as três linhas que eu uso para corrigir CherryPy para que seja executada em Heroku:
from cherrypy.process import servers
def fake_wait_for_occupied_port(host, port): return
servers.wait_for_occupied_port = fake_wait_for_occupied_port
Como Jason R. Coombs escreveu há um problema com pessoas com deficiência de auto-retorno dispositivo. heroku.com desativou auto-retorno, portanto, CherryPy irá falhar. I arquivou um bug para este .
Update: reportado como resolvida
. Eu corri para este problema ontem em um servidor Ubuntu Linux. Passei um par de horas tentando rastrear o bug no código CherryPy antes de eu percebi que a mensagem de erro é muito genérico. Ele vai dar a esta mensagem de erro mesmo se o anfitrião não possui o endereço IP ao qual o servidor está a tentar ligar. No meu caso, a interface loopback (lo, 127.0.0.1) foi desativado. Assim, mesmo se eu definir server.socket_host='0.0.0.0'
, a tentativa de verificar a porta, wait_for_occupied_port
, seria um fracasso (como ele assume, razoavelmente, que a interface de auto-retorno está sempre disponível). Depois de reativar a interface de auto-retorno, o servidor CherryPy iria começar a funcionar normalmente.
Update: CherryPy 3.2.3 tem uma correcção para este problema particular. Até 3.2.3 é liberado, o desenvolvimento constrói estão disponíveis nos CherryPy .
- Use-o em porta diferente (8000, por exemplo)
- Leia sobre ConfigApi (mais uma vez)
- Tente última versão não 3.0
- Também isso pode ser causado por algum firewall do Windows (segurança inteligente Eset ou talvez outro). Então, basta usá-lo na porta diferente.
Eu penso que eu tive um problema semelhante quando eu comecei usando CherryPy ... Mas eu não me lembro exatamente o que era ... Mas a correção envolveu o uso de um arquivo de configuração em vez de passar as configurações manualmente:
MyProj.conf:
[global] server.socket_host = "127.0.0.1" server.socket_port = 8080 server.thread_pool = 10
MyProj.py
import os
import cherrypy
class HelloWorld:
def index(self):
return "Hello world!"
index.exposed = True
# Assumes the config file is in the directory as the source.
conf_path = os.path.dirname(os.path.abspath(__file__))
conf_path = os.path.join(conf_path, "MyProj.conf")
cherrypy.config.update(conf_path)
cherrypy.quickstart(HelloWorld())
Este definitivamente funciona aqui.
Eu estou usando Python 2.6.1 e 3.1.1 CherryPy e eu executar o script com -W ignore
:
c:\My_path> python -W ignore MyProj.py
Se você está sob * nix, você deve colocar o -W ignore
no comentário #!
no topo do arquivo.
Se você está no OS X, tente chamar:
sudo lsof -i :8080
que lhe dirá o processo usando essa porta.
AVG Anti-Virus estava causando este problema para mim. Desinstalar o AVG (longe do ideal) fez o truque. Eu suspeito que o scanner link que eu não poderia desativar.
Eu tive o mesmo problema ao executar CherryPy 3.2.2 no meu Win7 PC com o Python 3.3 O servidor iria começar normalmente e, em seguida, iria falhar em cerca de um par de minutos.
Eu tenho aplicado a remendo de CherryPy 3.2.3 laurasia mencionado. Mas isso não ajuda.
Então eu tinha que comentar as linhas de levantar o erro no final de python\Lib\site-packages\cherrypy\process\servers.py
para impedir que o servidor de morrer:
...
# if host == client_host(host):
# raise IOError("Port %r not bound on %r" % (port, host))
...