2016-06-17 11 views
-1

Ich versuche SUMO über Traci-Schnittstelle zu starten. Ich kopiere dieses Beispiel aus dieser link kopiert. Der Code ist wie folgtFehler: IOStream hat keine Datei - SUMO

import os, sys 
import subprocess 

if 'SUMO_HOME' in os.environ: 
    tools = os.path.join(os.environ['SUMO_HOME'], 'tools') 
    sys.path.append(tools) 
else: 
    sys.exit("please declare environment variable 'SUMO_HOME'") 

PORT = 8813 
sumoBinary = "C:/Program Files (x86)/DLR/Sumo/bin/sumo-gui" 
sumoProcess = subprocess.Popen([sumoBinary, "-c", "example.sumocfg", \ 
     "--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr) 


import traci 
import traci.constants as tc 

traci.init(PORT) 
traci.vehicle.subscribe(vehID, (tc.VAR_ROAD_ID, tc.VAR_LANEPOSITION)) 
print(traci.vehicle.getSubscriptionResults(vehID)) 

for step in range(3): 
    print("step", step) 
    traci.simulationStep() 
    print(traci.vehicle.getSubscriptionResults(vehID)) 

traci.close() 

Wenn ich versuche, den Code auszuführen, es wirft mir den folgenden Fehler

File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 685, in runfile 
execfile(filename, namespace) 

    File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 85, in execfile 
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "C:/Users/Raja/Documents/vehicomPhd/SUMOTraffic/traci.py", line 22, in <module> 
"--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr) 

    File "C:\Anaconda3\lib\subprocess.py", line 823, in __init__ 
errread, errwrite) = self._get_handles(stdin, stdout, stderr) 

    File "C:\Anaconda3\lib\subprocess.py", line 1037, in _get_handles 
c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) 

    File "C:\Anaconda3\lib\site-packages\IPython\kernel\zmq\iostream.py", line 205, in fileno 
raise UnsupportedOperation("IOStream has no fileno.") 

UnsupportedOperation: IOStream has no fileno. 

Wer weiß, was falsch ist.

Antwort

5

Sieht aus, als ob Sie in einem ipython Notebook laufen. Sie haben nicht standardmäßige "Standard" -E/A-Streams, die nicht wie ein "echtes" Dateiobjekt verwendet werden können (da es sich wirklich um Datenwarteschlangen und nicht um Pipes handelt, haben sie keinen Dateideskriptor für Low Level I/O).

Sie können sie nicht mit Bibliotheken (wie subprocess) verwenden, die Low-Level-I/O durchführen; the error is there to tell you this.. Sie müssen ein echtes dateiähnliches Objekt verwenden, möglicherweise etwas so Einfaches wie das Senden einer Ausgabe an eine tempfile.TemporaryFile und dann das Kopieren der Ausgabe von der Datei nach stdout, wenn Sie das brauchen.

Es ist möglich, es würde funktionieren, indem Popenstdout und stderr Argumente überhaupt nicht übergeben; Das Standardverhalten für subprocess ist die gleiche stdout und stderr als Eltern verwenden, wenn also gültige Dateigriffe geöffnet sind (auch wenn das Notebook ersetzt sys.stdout/sys.stderr für Python verwenden), könnte es "einfach funktionieren" (wo "einfach funktionieren "beinhaltet die Möglichkeit, dass Daten, die an die zugrunde liegenden Dateideskriptoren 0 und 1 gesendet werden, verworfen werden, so dass Sie sie nie sehen.

Oder einfach nicht im ipython-Notebook laufen.

+0

Danke, dass Sie darauf hingewiesen haben. Ich habe 'stdout = sys.stdout, stderr = sys.stderr' mit' stdin = subprocess.PIPE, stdout = subprocess.PIPE' ersetzt und dieser Fehler wird nicht angezeigt. Allerdings habe ich jetzt einen anderen Fehler. 'Datei "C: /Users/Raja/Documents/vehicomPhd/SUMOTraffic/traci.py", Zeile 28, in traci.init (8813) Datei„C: \ Program Files (x86) \ DLR \ Sumo \ tools \ traci \ __ init__.py ", Zeile 469, in init return getVersion() TypeError: 'bytes' Objekt kann nicht implizit in str konvertiert werden. – Mechanic

+0

@Mechanic: Nicht genug Kontext, um etwas Bestimmtes zu geben, aber Zeug das kommt einem sofort in den Sinn: 1. Du machst eine Version von 'traci', die für Python 2 auf einem Python 3-Interpreter geschrieben ist (was oft nur mit' SyntaxError's abschneidet, aber nicht immer) 2. Du verwendest das ' PIPE-ed behandelt (binärer Modus) oder Daten von ihnen ("Bytes") in einem Kontext, der Textmodus-Handles oder "str" ​​-Daten erfordert. Wenn das der Fall ist, besteht die einfachste Lösung darin, ['universal_newlines = True'] (https://docs.python.org/3/library/subprocess.html#frequently-used-arguments) an den' Popen'-Konstruktor zu übergeben Öffnen Sie Textmodus-Streams. – ShadowRanger

+0

Das Problem liegt an der Inkosistenz zwischen Python 2 und 3 und Sie haben richtig darauf hingewiesen. – Mechanic

0

Das Problem war, dass meine Kommandozeile Python 2 verwendete, während die Spyder-IDE python 3 verwendete. Da ich keine weiteren Argumente an die stdin übergeben muss, entfernte ich die Option und versuchte einfach, die Sumo-GUI zu öffnen subprocess wie folgt. Es funktioniert jetzt.

PORT = 8813 
sumoBinary = 'C:/Program Files (x86)/DLR/Sumo/bin/sumo-gui' 
sumoProcess = subprocess.Popen([sumoBinary, "-c", "Kaiserslautern.sumocfg", \ 
     "--remote-port", str(PORT)]) 
Verwandte Themen