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 queselect()
fournit neccessary (qui, évidemment, ne fonctionne pas comme ça ici)
S'il vous plaît, aidez-moi!