2010-08-13 6 views
1

Bonne journée, Stackoverflow!Comment rendre ceci compatible avec Windows?

J'ai un petit (gros) problème avec le portage d'un de mes scripts Python pour Linux vers Windows. Le truc poilu à ce sujet est que je dois commencer un processus et rediriger tous ses flux dans des tuyaux que je vais et lire et écrire dans et dans mon script.

Avec Linux cela est un morceau de gâteau:

server_startcmd = [ 
      "java", 
      "-Xmx%s" % self.java_heapmax, 
      "-Xms%s" % self.java_heapmin, 
      "-jar", 
      server_jar, 
      "nogui" 
     ] 

server = Popen(server_startcmd, stdout = PIPE, 
           stderr = PIPE, 
           stdin = PIPE) 

outputs = [ 
    server_socket, # A listener socket that has been setup before 
    server.stderr, 
    server.stdout, 
    sys.stdin # Because I also have to read and process this. 
    ] 

clients = [] 

while True: 
    read_ready, write_ready, except_ready = select.select(outputs, [], [], 1.0) 

    if read_ready == []: 
     perform_idle_command() # important step 
    else: 
     for s in read_ready: 
      if s == sys.stdin: 
       # Do stdin stuff 
      elif s == server_socket: 
       # Accept client and add it to 'clients' 
      elif s in clients: 
       # Got data from one of the clients 

L'ensemble alternatif à 3 voies entre une socket serveur, l'entrée standard du script et les canaux de sortie du processus enfant (ainsi que le canal d'entrée, car mon script écrira à celui-là, bien que celui-ci ne soit pas dans la liste select()) est la partie la plus importante du script.

Je sais que pour Windows il y a win32pipe dans le module win32api. Le problème est que trouver des ressources pour cette API est assez difficile, et ce que j'ai trouvé n'était pas vraiment utile. Comment utiliser ce module win32pipe pour faire ce que je veux? J'ai des sources où il est utilisé dans une situation différente, mais similaire, mais qui me confondais à peu près:

if os.name == 'nt': 
    import win32pipe 
    (stdin, stdout) = win32pipe.popen4(" ".join(server_args)) 
else: 
    server = Popen(server_args, 
    stdout = PIPE, 
    stdin = PIPE, 
    stderr = PIPE) 
    outputs = [server.stderr, server.stdout, sys.stdin] 
    stdin = server.stdin 

[...] 

while True: 
    try: 
     if os.name == 'nt': 
     outready = [stdout] 
     else: 
     outready, inready, exceptready = select.select(outputs, [], [], 1.0) 
    except: 
     break 

stdout est ici le stdout combiné et stderr du processus de l'enfant qui a été commencé avec win32pipe.popen4(...)

les arsing de questions sont:

  • Pourquoi ne pas select() pour la version windows? Est-ce que ça ne marche pas?
  • Si vous n'utilisez pas select() là, comment puis-je mettre en œuvre le délai d'attente que select() fournit neccessary (qui, évidemment, ne fonctionne pas comme ça ici)

S'il vous plaît, aidez-moi!

Répondre

0

Je pense que vous ne pouvez pas utiliser select() sur les tuyaux. Dans l'un des projets, où je portais une application Linux sous Windows, j'avais également manqué ce point et dû réécrire toute la logique.

Questions connexes