错误:IOStream没有fileno - SUMO

时间:2016-06-17 12:50:19

标签: python

我试图通过traci接口运行SUMO。我从这个link复制粘贴了这个例子。代码如下

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

当我尝试运行代码时,它会抛出以下错误

  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.

任何人都知道什么是错的。

2 个答案:

答案 0 :(得分:5)

看起来您正在ipython笔记本中运行。他们有非标准的&#34;标准&#34; I / O流不能像&#34; true&#34;一样使用。文件对象(因为它们实际上是数据队列,而不是管道,因此它们没有用于低级I / O的文件描述符)。

您不能将它们与执行低级I / O的库(如subprocess)一起使用; the error is there to tell you this.。您需要使用类似文件的真实对象,这可能就像将输出发送到tempfile.TemporaryFile一样简单,然后将文件中的输出复制到stdout,如果这就是您的意思需要。

只要不传递Popen stdoutstderr参数,它就可以工作; subprocess的默认行为是使用相同的stdoutstderr作为父项,因此如果打开了有效的文件句柄(即使笔记本替换为sys.stdout / { {1}}对于Python使用),它可能&#34;只是工作&#34; (其中&#34;只是工作&#34;包括发送到基础文件描述符sys.stderr0的数据被丢弃的可能性,所以你永远不会看到它。)

或者只是不要在ipython笔记本中运行。

答案 1 :(得分:0)

问题是我的命令行使用了Python 2,而spyder IDE使用了python 3.由于我不需要再向stdin传递任何参数,我删除了该选项并且只是尝试用{打开sumo-gui {1}}如下。它现在有效。

var alert = UIAlertController.Create("Title", "Message", UIAlertControllerStyle.Alert);
alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, ActionHandler));