#c# #python #ipc
#c# #python #ipc
Вопрос:
Я не могу использовать IronPython, пока он не будет одобрен, и мне сообщили, что это может занять довольно много времени, поэтому я пытаюсь заставить некоторые сетевые алгоритмы работать из командной строки, чтобы их можно было использовать в коде C #. Я пытаюсь передать сеть в качестве аргумента из командной строки. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я определяю график
graph = {'s': {'a': 2, 'b': 1}, 'a': {'s': 3, 'b': 4, 'c':8}, 'b': {'s': 4, 'a': 2, 'd': 2}, 'c': {'a': 2, 'd': 7, 't': 4}, 'd': {'b': 1, 'c': 11, 't': 5}, 't': {'c': 3, 'd': 5}}
в коде Python это отлично работает, и я получаю желаемый ответ. Когда я пытаюсь отправить его в качестве аргумента:
C:\Python27\Python.exe C:\PythonFiles\DijkstraAlgorithm3.py "{'s': {'a': 2, 'b': 1}, 'a': {'s': 3, 'b': 4, 'c':8}, 'b': {'s': 4, 'a': 2, 'd': 2}, 'c': {'a': 2, 'd': 7, 't': 4}, 'd': {'b': 1, 'c': 11, 't': 5}, 't': {'c': 3, 'd': 5}}"
Я получаю следующую ошибку:
Traceback (most recent call last):
File "C:\PythonFiles\DijkstraAlgorithm3.py", line 60, in <module>
dijkstra(args.g,'s','t')
File "C:\PythonFiles\DijkstraAlgorithm3.py", line 27, in dijkstra
for neighbor in graph[src] :
TypeError: string indices must be integers, not str
Я также заметил, что порядок сети, похоже, отличается при определении в коде по сравнению с отправкой через командную строку, хотя я передаю его таким же образом. Вот весь код:
import argparse
def dijkstra(graph,src,dest,visited=[],distances={},predecessors={}):
# a few sanity checks
if src not in graph:
raise TypeError('The root of the shortest path tree cannot be found')
if dest not in graph:
raise TypeError('The target of the shortest path cannot be found')
# ending condition
if src == dest:
# We build the shortest path and display it
path=[]
pred=dest
while pred != None:
path.append(pred)
pred=predecessors.get(pred,None)
print('shortest path: ' str(path) " cost=" str(distances[dest]))
else :
# if it is the initial run, initializes the cost
if not visited:
distances[src]=0
# visit the neighbors
for neighbor in graph[src] :
if neighbor not in visited:
new_distance = distances[src] graph[src][neighbor]
if new_distance < distances.get(neighbor,float('inf')):
distances[neighbor] = new_distance
predecessors[neighbor] = src
# mark as visited
visited.append(src)
# now that all neighbors have been visited:
recurse
# select the non visited node with lowest distance 'x'
# run Dijskstra with src='x'
unvisited={}
for k in graph:
if k not in visited:
unvisited[k] = distances.get(k,float('inf'))
x=min(unvisited, key=unvisited.get)
dijkstra(graph,x,dest,visited,distances,predecessors)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('g', help='This is the network')
# Parse the given arguments
args = parser.parse_args()
graph = {'s': {'a': 2, 'b': 1}, 'a': {'s': 3, 'b': 4, 'c':8}, 'b': {'s': 4, 'a': 2, 'd': 2}, 'c': {'a': 2, 'd': 7, 't': 4}, 'd': {'b': 1, 'c': 11, 't': 5}, 't': {'c': 3, 'd': 5}}
#print args.g
#print graph
dijkstra(args.g,'s','t')
Комментарии:
1. Ваш аргумент
args.g
— это строка, но вы действуете так, как будто это словарь. Если вы хотите разобрать его в словаре, вы можете сделать это с помощьюast.literal_eval
, если это легальный литерал словаря Python.2. Пожалуйста, не делайте этого. Использовать конфигурационный файл (JSON?) и передать его вместо этого ? 🙂
3. Спасибо, любезный. Это сработало отлично! К сожалению, я не могу передать файл.