2009-04-20 33 views
13

Khi tôi đang chạy CherryPy Hello World:CherryPy Hello World lỗi

import cherrypy 

class HelloWorld: 
    def index(self): 
     return "Hello world!" 
    index.exposed = True 

cherrypy.config.update({'server.socket_port': 8080,}) 
cherrypy.quickstart(HelloWorld()) 

... Tôi có được điều này: IOError: Port 8080 không bị ràng buộc về 'localhost'. Nó có thể là gì?

+0

tôi đã phải đối mặt với vấn đề này trước đây. Tôi hy vọng câu hỏi này sẽ giúp ai đó. –

Trả lời

7

Bạn có thể có thứ gì đó khác đang nghe trên cổng đó.

Trên Linux làm:

netstat -pnl | grep 8080 

Và xem những gì quá trình đang lắng nghe trên 8080

Trên Windows sử dụng một cái gì đó giống như TCPView để làm như vậy.

1
  • Sử dụng nó trên cổng khác nhau (8000 chẳng hạn)
  • Đọc về ConfigApi (một lần nữa)
  • Hãy thử phiên bản mới nhất không 3,0
  • Ngoài ra điều này có thể được gây ra bởi một số tường lửa Windows (Eset an ninh thông minh hoặc có thể khác). Vì vậy, chỉ cần sử dụng nó trên cổng khác nhau.
1

Tôi nghĩ mình gặp vấn đề tương tự khi bắt đầu sử dụng CherryPy ... Nhưng tôi không thể nhớ chính xác nó là gì ... Nhưng việc sửa lỗi có liên quan bằng cách sử dụng tệp cấu hình thay vì truyền cấu hình bằng tay:

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()) 

này chắc chắn làm việc ở đây.
Tôi đang sử dụng Python 2.6.1 và 3.1.1 CherryPy và tôi chạy kịch bản với -W ignore:

 
c:\My_path> python -W ignore MyProj.py 

Nếu bạn dưới * nix, bạn nên đặt -W ignore trong #! comment ở phía trên của tệp.

+0

"Bỏ qua -W" là vì CherryPy 3.1.1 không sẵn sàng hoàn toàn với Python 2.6; nhưng nó vẫn đủ tốt cho nhu cầu nội bộ của chúng tôi ở đây. – joce

0

AVG Anti-Virus đã gây ra sự cố này cho tôi. Gỡ bỏ AVG (xa lý tưởng) đã làm các trick. Tôi nghi ngờ máy quét liên kết mà tôi không thể tắt.

2

Tôi đã gặp sự cố này ngày hôm qua trên máy chủ Ubuntu Linux. Tôi đã dành một vài giờ cố gắng để theo dõi các lỗi trong mã CherryPy trước khi tôi nhận ra rằng thông báo lỗi là rất chung chung. Nó sẽ cung cấp thông báo lỗi này ngay cả khi máy chủ không sở hữu địa chỉ IP mà máy chủ đang cố gắng liên kết. Trong trường hợp của tôi, giao diện loopback (lo, 127.0.0.1) đã bị vô hiệu hóa. Vì vậy, ngay cả khi tôi đặt server.socket_host='0.0.0.0', nỗ lực kiểm tra cổng, wait_for_occupied_port, sẽ không thành công (vì nó giả định, hợp lý, giao diện loopback luôn sẵn có). Sau khi kích hoạt lại giao diện loopback, máy chủ CherryPy sẽ khởi động bình thường.

Cập nhật: CherryPy 3.2.3 có bản sửa lỗi cho vấn đề cụ thể này. Cho đến khi 3.2.3 được phát hành, các bản xây dựng phát triển có sẵn trên CherryPy project downloads.

9

Nếu bạn đang cố gắng triển khai CherryPy trên Heroku, nơi bạn không thể sử dụng loopback để kiểm tra xem bạn đã thực sự mở ra một cổng, thì bạn cần phải chỉ đơn giản là vô hiệu hóa wait_for_occupied_port() chức năng CherryPy sao cho CherryPy của tự kiểm tra tính thống nhất không quyết định rằng nó có, trên thực tế, không bắt đầu. Dưới đây là ba dòng mà tôi sử dụng để sửa chữa CherryPy để nó chạy trên 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 
+1

Trong khi cực kỳ hữu ích câu trả lời này thực sự không thuộc về ở đây vì nó có rất ít để làm với câu hỏi ban đầu của OP. Trong trường hợp này, nó phù hợp hơn với __ask__ một câu hỏi chi tiết và cụ thể hơn cho câu trả lời rất có giá trị của bạn, __then__ tất nhiên, trả lời nó :). Tôi nhận ra những người khác có câu trả lời tương tự cho câu hỏi này ở đây ... nhưng đó là nhiều hơn một hijack thread sau đó bất cứ điều gì. –

+3

Câu trả lời của tôi liên quan đến việc chạy tập lệnh ** chính xác ** đó và nhận được lỗi ** chính xác ** đó. Tôi không thấy làm thế nào mà có "rất ít để làm" với câu hỏi. Bạn có thể thấy câu trả lời của @ laurasia rằng những người khác cũng nghĩ rằng câu trả lời của tôi cũng phù hợp với câu hỏi này. –

+1

Vâng, chỉ cần xác nhận tôi __do__ nhận IOError và ChannelFailures: IOError, đôi khi, và đôi khi tôi chỉ nhận được SIGTERM. Vì vậy, bạn đã đúng, tôi đã sai về bình luận "rất ít để làm". Việc thiếu lỗi đôi khi là nguyên nhân gây nhầm lẫn của tôi. Tôi vẫn sẽ nghiêng nhẹ về phía một sợi mới mặc dù;) –

0

tôi đã cùng một vấn đề khi chạy CherryPy 3.2.2 trên máy tính của Win7 của tôi với Python 3.3 Các máy chủ sẽ bắt đầu bình thường và sau đó sẽ sụp đổ trong khoảng một vài phút.

tôi đã áp dụng các patch từ CherryPy 3.2.3 Laurasia đề cập. Nhưng nó không giúp được gì.

Vì vậy, tôi đã phải nhận xét ra các dòng nâng lỗi ở cuối của python\Lib\site-packages\cherrypy\process\servers.py để ngăn chặn các máy chủ từ chết:

... 
# if host == client_host(host): 
#  raise IOError("Port %r not bound on %r" % (port, host)) 
... 
+0

Tôi đã có cùng một vấn đề, với các thiết lập tương tự, chỉ trên OS X. Tôi chỉ nhận xét ra dòng cuối cùng trong cùng một tập tin. 'nâng IOError (" Cổng% r không bị ràng buộc trên% r "% (cổng, máy chủ))' –

1

Nếu bạn đang ở trên OS X, hãy thử gọi:

sudo lsof -i :8080 

mà sẽ cho bạn biết quá trình sử dụng cổng đó.