簡體   English   中英

(Jython)從Java運行python腳本的問題

[英](Jython) Problems to run python script from java

我寫了2個python腳本,分別命名為Runner.py和connect.py。 Runner腳本使用一個特定的端口啟動流量仿真,另一個連接並能夠發送命令。 這兩個腳本在我的python IDE中都可以正常工作。 但是我想從Java啟動這兩個腳本來接收數據。

import org.python.core.PyInstance;
import org.python.util.PythonInterpreter;
import org.python.core.PyObject;
import org.python.core.PyString;

public class PythonHandler {

    PythonInterpreter interpreter = null;
    String script_dir;

    public PythonHandler() {
        PythonInterpreter.initialize(System.getProperties(), System.getProperties(), new String[0]);

        this.interpreter = new PythonInterpreter();
        this.script_dir = System.getProperty("user.dir");
    }

    void execfile(final String fileName) {
        this.interpreter.execfile(fileName);
    }

    PyInstance createClass(final String className, final String opts) {
        return (PyInstance) this.interpreter.eval(className + "(" + opts + ")");
    }

    /**
     * This method will start the python script runner.py
     * NOTE: doesn't work if there is not a main method in the python script
     */
    public void startRunner() {
        String runner_dir = script_dir + "\\src\\de\\uniol\\inf\\is\\odysseus\\pgtaxi\\traci\\traci4python\\runner.py";
        PythonHandler ie = new PythonHandler();
        ie.execfile(runner_dir);
    }

    /**
     * This method will start the python script connect.py
     * NOTE: doesn't work if there is not a main method in the python script
     */
    public void startConnect() {
        String connect_dir = script_dir
                + "\\src\\de\\uniol\\inf\\is\\odysseus\\pgtaxi\\traci\\traci4python\\connect.py";
        PythonHandler ie = new PythonHandler();
        ie.execfile(connect_dir);
    }

    /**
     * This method will start the python script connect.py 
     * If there is not a main method you can run a specific function
     * 
     * @param function
     *            name of the function you want to start
     */
    public void callConnectFunction(String function) {
        String connect_dir = script_dir
                + "\\src\\de\\uniol\\inf\\is\\odysseus\\pgtaxi\\traci\\traci4python\\connect.py";
        PythonHandler ie = new PythonHandler();
        ie.execfile(connect_dir);
        PyInstance run = ie.createClass("Connection", "None");
        run.invoke(function);
    }

    /**
     * This method will start the python script runner.py
     * If there is not a main method you can run a specific function
     * 
     * @param function
     *            name of the function you want to start
     */
    public void callRunnerFunction(String function) {
        String runner_dir = script_dir + "\\src\\de\\uniol\\inf\\is\\odysseus\\pgtaxi\\traci\\traci4python\\connect.py";
        PythonHandler ie = new PythonHandler();
        ie.execfile(runner_dir);
        PyInstance run = ie.createClass("Runner", "None");
        run.invoke(function);
    }
}

這兩個腳本都啟動,但是在connect.py中會發生錯誤。 我不理解為什么我能夠從python IDE而不是從Java代碼運行腳本。 以下是python腳本中的代碼:

runner.py

import sys
import subprocess
import os

PORT = 8873

class Runner:  
__gui = None

def __init__(self, gui):
    self.__gui = gui
    print "Starting runner..."

def runLocal(self):
    sumoBinary = os.path.abspath(os.curdir)
    sumoBinary = sumoBinary.split('de.uniol.inf.is.odysseus.pgtaxi')[0]
    sumoBinary = sumoBinary + 'de.uniol.inf.is.odysseus.pgtaxi\\sumo\\bin\\sumo-gui'
    scenario = os.path.abspath(os.curdir)
    scenario = sumoBinary.split('de.uniol.inf.is.odysseus.pgtaxi')[0]
    scenario = scenario + 'de.uniol.inf.is.odysseus.pgtaxi\\scenario\\oldenburg.sumocfg'
    sumoProcess = subprocess.Popen([sumoBinary, "-c", scenario, "--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr)

if __name__ == '__main__':
conn = Runner('None')
conn.runLocal()

connect.py

import sys
import os

PORT = 8873

class Connection:
__gui = None

def __init__(self, gui):
    self.__gui = gui
    print "Starting connect..."

def initTraci(self):
    tools = os.path.abspath(os.curdir)
    tools = tools.split('de.uniol.inf.is.odysseus.pgtaxi')[0]
    tools = tools + 'de.uniol.inf.is.odysseus.pgtaxi\\sumo\\tools'
    sys.path.append(tools)
    import traci
    traci.init(PORT)
    step = 0
    while step < 1000:   
        traci.simulationStep()
        step += 1

    traci.close()
    sys.stdout.flush()

def getFreePort(self):
    tools = os.path.abspath(os.curdir)
    tools = tools.split('de.uniol.inf.is.odysseus.pgtaxi')[0]
    tools = tools + 'de.uniol.inf.is.odysseus.pgtaxi\\sumo\\tools'
    sys.path.append(tools)
    import sumolib
    PORT = sumolib.miscutils.getFreeSocketPort()

if __name__ == '__main__':
conn = Connection('None')
conn.initTraci()

我得到這個異常:

 Exception in thread "MainThread" Traceback (most recent call last):
  File "C:\Users\FEPREUSS\Desktop\PG\workspace\de.uniol.inf.is.odysseus.pgtaxi\src\de\uniol\inf\is\odysseus\pgtaxi\traci\traci4python\connect.py", line 44, in <module>
    conn.initTraci()
  File "C:\Users\FEPREUSS\Desktop\PG\workspace\de.uniol.inf.is.odysseus.pgtaxi\src\de\uniol\inf\is\odysseus\pgtaxi\traci\traci4python\connect.py", line 25, in initTraci
    traci.init(PORT)
  File "C:\Users\FEPREUSS\Desktop\PG\workspace\de.uniol.inf.is.odysseus.pgtaxi\sumo\tools\traci\__init__.py", line 65, in init
    return getVersion()
  File "C:\Users\FEPREUSS\Desktop\PG\workspace\de.uniol.inf.is.odysseus.pgtaxi\sumo\tools\traci\__init__.py", line 82, in getVersion
    return _connections[""].getVersion()
AttributeError: 'NoneType' object has no attribute 'getVersion'

lib中引起該異常的兩種方法:

def init(port=8813, numRetries=10, host="localhost", label="default"):
    """
    Establish a connection to a TraCI-Server and store it under the given
    label. This method is not thread-safe. It accesses the connection
    pool concurrently.
    """
    _connections[label] = connect(port, numRetries, host)
    switch(label)
    return getVersion()

def getVersion():
    return _connections[""].getVersion()

希望可以有人幫幫我。

您偶然發現了一個jython錯誤 ,該錯誤被SUMO隱藏了,該錯誤隱藏了套接字連接失敗的錯誤消息。 不幸的是,除了在第49行中編輯SUMO / tools / traci / connection.py之外,您無法輕松解決它。

只需將self._socket = socket()替換為

self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)

一個解決方法也提交給SUMO存儲庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM