【问题标题】:How to declare ports in Cloud9 using Python如何使用 Python 在 Cloud9 中声明端口
【发布时间】:2012-10-10 14:45:50
【问题描述】:

我刚开始使用 Cloud9 IDE (c9),到目前为止它看起来不错,除了一些小问题。

我从文档中看到,要启动一个简单的 node.js http 服务器,您必须传入 process.env.PORT 来代替常规端口,例如“8080”。

Node Hello World example:

 var http = require('http');
 http.createServer(function (req, res) {
     res.writeHead(200, {'Content-Type': 'text/plain'});
     res.end('Hello World\n');
 }).listen(process.env.PORT, process.env.IP);

我想知道的是,在c9上,你只能使用javascript/node.js在端口上启动服务吗?或者其他语言也能正常工作,也许还有其他一些通过端口的方法?特别是 python + Twisted?

我上传了一些在本地为我工作的扭曲代码,但无法在 c9 上工作,因为它试图访问本地端口(已在使用中)。这是错误

twisted.internet.error.CannotListenError: Couldn't listen on any:8080: [Errno 98] Address already in use.

如果可能的话,如何使以下示例在 c9 上运行?

Python+Twisted Hello World example

from twisted.web import server, resource
from twisted.internet import reactor

class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        return "<html>Hello, world!</html>"

site = server.Site(Simple())
reactor.listenTCP(8080, site)
reactor.run()

通过 documentation 和 github issues 的初步搜索并没有出现太多。我希望这是可能的,我只是错过了要传递的正确参数。


编辑:更新下面的输出

节点代码

console.log(process.env.PORT)
console.log(process.env.IP)

终端输出

Running Node Process
Tip: you can access long running processes, like a server, at 'http://private-cloud.mrchampe.c9.io'.
Important: in your scripts, use 'process.env.PORT' as port and 'process.env.IP' as host.
8080
127.6.70.129

Python 代码

import os

print os.environ["PORT"]
print os.environ["IP"]

终端输出

Running Python Process
8080
127.6.70.129

扭曲的代码

import os
import twisted

from twisted.web import server, resource
from twisted.internet import reactor

class Simple(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        return "<html>Hello, world!</html>"

site = server.Site(Simple())

reactor.listenTCP(int(os.environ["PORT"]), interface=os.environ["IP"])
reactor.run()

终端输出

Running Python Process
hello world
Traceback (most recent call last):
  File "python/hello.py", line 17, in <module>

reactor.listenTCP(int(os.environ["PORT"]), interface=os.environ["IP"])
TypeError: listenTCP() takes at least 3 non-keyword arguments (2 given)

listenTCP TypeError 很奇怪,因为 2 个参数在本地有效,但在 Cloud9 上无效。我不明白为什么使用这些参数不起作用。

我将上述代码托管在this public Cloud9 项目上,供任何人查看。谢谢!

【问题讨论】:

    标签: python port twisted cloud9-ide


    【解决方案1】:

    process.env.PORTprocess.env.IP 来自 Node.js sound like os.environ["PORT"]os.environ["IP"] 在 Python 中。或许你可以试试:

    reactor.listenTCP(int(os.environ["PORT"]), site, interface=os.environ["IP"])
    

    【讨论】:

    • 谢谢! os.environ 命令 are 显示的值与 node.js 报告的值相同。但是,似乎 python/Twisted 仍然没有绑定到端口。我认为这要么是因为给 reactor.listenTCP 的参数(它给出了错误),要么是因为平台不允许这样做。
    【解决方案2】:

    这可能是c9环境管理的限制,所以用户不要过度滥用他们的服务。我会假设他们对 Node.js 使用的资源有一定程度的管理,因此允许它们打开端口。

    如果是这种情况并且我不得不使用 cloud9,我可能会按以下方式处理: - 创建充当代理的 Node.js 服务,以扭曲的方式进行侦听 - 使用重写的 listenTCP 和 listenUDP 方法创建新反应器,这会将这些方法绑定到 Node.js 代理服务。

    代理的工作方式如下,Node.js 最初会监听一个“管理”TCP 端口。然后,当 twisted 服务启动时,它会通过该端口在 Node.js 和自身之间创建一个 TCP 连接。然后,每当调用 listenTCP 或 listenUDP 时,这些命令就会被分派给 Node.js 服务,作为回报,该服务会打开端口,然后通过该端口的所有通信都将通过现有的 TCP 连接进行代理。

    【讨论】:

    • 我也是这么想的。我担心有人可能不得不按照您的建议编写 node.js 代理。但是,使用 python,您可以使用“os.environ”,如另一个答案所示。然而,我同意,尽管 this 不是 cloud9 的限制,但总的来说,还有许多其他限制会使 ide 上的某些事情变得麻烦。感谢您的建议。
    【解决方案3】:

    值得一提的是,Jean-Paul 的回答也对我有用,但我不得不使用“地址”而不是“接口”:

    http_server.listen(int(os.environ.get("PORT")), address=os.environ["IP"])
    

    【讨论】:

    • 我很好奇 - 您使用的是 Twisted 还是其他框架(bottle、tornado 等)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2018-01-19
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多