我试图通过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.
任何人都知道什么是错的。
答案 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
stdout
和stderr
参数,它就可以工作; subprocess
的默认行为是使用相同的stdout
和stderr
作为父项,因此如果打开了有效的文件句柄(即使笔记本替换为sys.stdout
/ { {1}}对于Python使用),它可能&#34;只是工作&#34; (其中&#34;只是工作&#34;包括发送到基础文件描述符sys.stderr
和0
的数据被丢弃的可能性,所以你永远不会看到它。)
或者只是不要在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));