Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript客户端设置Python服务器端_Javascript_Python - Fatal编程技术网

如何使用javascript客户端设置Python服务器端

如何使用javascript客户端设置Python服务器端,javascript,python,Javascript,Python,因此,已经有一个Python程序在控制台上运行,我必须在此基础上进行构建。我将使用Javascript为应用程序构建一个web GUI界面。 我将如何: a。继续处理这个Python程序的输入/输出,而不涉及原始代码 b。通过Javascript调用向Python程序发送控制台行输入。我已经研究了原始HTTP请求/AJAX,但我不确定如何将其作为输入发送到Python程序 是另一个选项,但对于您的需要来说可能太高了。这取决于您包装的应用程序类型以及GUI选项如何转换为应用程序命令。但你有两个目标

因此,已经有一个Python程序在控制台上运行,我必须在此基础上进行构建。我将使用Javascript为应用程序构建一个web GUI界面。 我将如何:

a。继续处理这个Python程序的输入/输出,而不涉及原始代码

b。通过Javascript调用向Python程序发送控制台行输入。我已经研究了原始HTTP请求/AJAX,但我不确定如何将其作为输入发送到Python程序


是另一个选项,但对于您的需要来说可能太高了。

这取决于您包装的应用程序类型以及GUI选项如何转换为应用程序命令。但你有两个目标:

  • 编写一个包装器,允许您读取程序的输出并为其提供输入

  • 使web服务器接收GUI事件并将其转换为命令以传递给“包装器”

  • 我做了一些你需要做的事情

  • 本质上,您需要将套接字流转换为谨慎的命令。这方面的事实工具是,以及它的任何包装器(我使用过Python包装器,并且有很好的使用经验)

  • 这一部分可能并不简单。问题是您的底层程序一直在运行,因此您的web服务器应该是全状态的,以便跨请求了解该程序。另一个选项是,您的web服务器只需重新连接到进程并发出它的命令,然后在标准输出流中遇到响应时发回响应,但根据程序的速度,最终的响应时间可能会很长。还有一个不匹配之处,即AJAX请求是异步的,而您的底层程序是同步的。所以是的,这可能会变得非常复杂。这真的取决于你的计划。如果您可以添加一些关于程序和GUI的详细信息,这会有所帮助


  • a。要处理程序的输入/输出:。它相当容易使用,阅读随它一起分发的一些示例应该可以教会您足够多的知识,让您掌握基本知识

    b。Javascript接口:

    我使用gevent,它是内置的WSGI服务器。(查找a()是什么)。我应该注意,这个程序将保持一个状态,因此您可以通过向javascript客户机返回会话ID并将您的pexpect会话存储在一个全局变量或其他容器中来管理打开的会话,这样您就可以跨多个独立的AJAX请求完成程序的输入和输出。然而,我把这件事留给你,因为这并不是那么简单

    我的示例所要做的就是在单击您选择的内容后将POST请求放入其中。(它实际上不起作用,因为有些变量没有设置。请设置它们。)

    以下是相关部分:

    <!-- JavaScript -->
    <script src="jquery.js"></script>
    <script type="text/javascript">
    function toPython(usrdata){
        $.ajax({
            url: "http://yoursite.com:8080",
            type: "POST",
            data: { information : "You have a very nice website, sir." , userdata : usrdata },
            dataType: "json",
            success: function(data) {
                <!-- do something here -->
                $('#somediv').html(data);
            }});
    $("#someButton").bind('click', toPython(something));
    </script>
    
    如果您的程序是面向对象的,那么集成它就相当容易了。编辑:不需要是面向对象的。我现在已经包含了一些Pexpect代码

    global d
    d = someClass()
    def application(environ, start_response):
        # get the instruction
        password = somethingfromwsgi # read the tutorials on WSGI to get the post stuff
        # figure out WHAT to do
        global d
        success = d.doSomething()
        # or success = funccall()
        prog = pexpect.spawn('python someprogram.py')
        prog.expect("Password: ")
        prog.sendline(password)
        i = prog.expect(["OK","not OK", "error"])
        if i==0:
            start_response("200 OK", [("Content-Type", "text/html; charset=utf-8")])
            return "Success"
        elif i==1:
            start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
            return "Failure"
        elif i==2:
            start_response("500 Internal Server Error", [("Content-Type", "text/html; charset=utf-8")])
            return "Error"
    

    我建议的另一个选择是Nginx+uWSGI。如果你愿意,我也可以给你举一些例子。它使您能够将Web服务器合并到设置中。

    要将数据从javascript透明地传递到外部Python程序,您可以使用WebSocket协议连接服务器和javascript,并使用stdin/stdout从服务器与外部程序通信

    下面是一个示例Python程序
    client.py

    #/usr/bin/env python
    “”“将标准输入转换为大写。”“”
    对于iter中的线路(原始输入,“退出”):
    打印行。上()
    
    我已使用中的代码创建了一个服务器,请回答以下问题:

    #/usr/bin/python
    “”“WebSocket CLI接口。”“”
    导入系统
    从twisted.application导入strport#pip安装twisted
    从twisted.application导入服务
    从twisted.internet导入协议
    从twisted.python导入日志
    从twisted.web.server导入站点
    从twisted.web.static导入文件
    从txws导入WebSocketFactory#pip安装txws
    类协议(Protocol.Protocol):
    def connectionMade(自):
    从twisted.internet导入
    msg(“在每个新连接上启动一个新进程”)
    self.pp=ProcessProtocol()
    self.pp.factory=self
    reactor.spawnProcess(self.pp、sys.executable、,
    [sys.executable'-u',client.py']
    接收到def数据(自身、数据):
    log.msg(“将收到的数据重定向到进程的stdin:%r”%data)
    self.pp.transport.write(数据)
    def connectionLost(自身、原因):
    self.pp.transport.loseConnection()
    def_发送(自身、数据):
    self.transport.write(数据)#发回
    类ProcessProtocol(protocol.ProcessProtocol):
    def connectionMade(自):
    log.msg(“connectionMade”)
    def输出(自身、数据):
    log.msg(“将标准输出发送回%r”%data)
    自发送(数据)
    接收到的def错误(自身、数据):
    log.msg(“将stderr发回%r”%data)
    自发送(数据)
    def进程已退出(自身、原因):
    log.msg(“processExited”)
    def PROCESSEND(自我、原因):
    log.msg(“processEnded”)
    def_发回(自身、数据):
    自我工厂发送(数据)
    application=service.application(“ws-cli”)
    _echofactory=protocol.Factory()
    _echofactory.protocol=协议
    strport.service(“tcp:8076:interface=127.0.0.1”,
    WebSocketFactory(_echofactory)).setServiceParent(应用程序)
    resource=File('.')#服务当前目录,包括*.py文件
    strport.service(“tcp:8080:interface=127.0.0.1”,
    站点(资源)).setServiceParent(应用程序)
    
    web客户端部分,
    sendkeys.html

    <!doctype html>
    <title>Send keys using websocket and echo the response</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
    </script>
    <script src="sendkeys.js"></script>
    <input type=text id=entry value="type something">
    <div id=output>Here you should see the typed text in UPPER case</div>
    
    要尝试它:

    • 安装twisted,
      txws

      $ pip install twisted txws
      
    • 运行:

      $ twistd -ny wscli.py
      
    • 访问
      http://localhost:8080/$ pip install twisted txws
      
      $ twistd -ny wscli.py