Je le code python suivant:Utilisation de descripteurs de fichiers pour communiquer entre les processus
import pty
import subprocess
os=subprocess.os
from subprocess import PIPE
import time
import resource
pipe=subprocess.Popen(["cat"], stdin=PIPE, stdout=PIPE, stderr=PIPE, \
close_fds=True)
skip=[f.fileno() for f in (pipe.stdin, pipe.stdout, pipe.stderr)]
pid, child_fd = pty.fork()
if(pid==0):
max_fd=resource.getrlimit(resource.RLIMIT_NOFILE)[0]
fd=3
while fd<max_fd:
if(fd not in skip):
try:
os.close(fd)
except OSError:
pass
fd+=1
enviroment=os.environ.copy()
enviroment.update({"FD": str(pipe.stdin.fileno())})
os.execvpe("zsh", ["-i", "-s"], enviroment)
else:
os.write(child_fd, "echo a >&$FD\n")
time.sleep(1)
print pipe.stdout.read(2)
Comment puis-je réécrire pour qu'il n'utilisera Popen
et cat
? J'ai besoin d'un moyen de transmettre les données d'une fonction shell exécutée dans le shell interactif qui ne se mélange pas avec les données créées par d'autres fonctions (donc je ne peux pas utiliser stdout ou stderr).
Pourquoi ne pouvez-vous pas juste "subprocess.Popen()" le shell directement? – llasram
@llasram parce que j'ai besoin d'un shell interactif pour capturer les arguments passés à l'achèvement builtin 'compadd'. Pas de tty - pas d'interaction - pas de complétion. – ZyX
Je ne suis pas tout à fait la suite ... Pourriez-vous donner un exemple concret? – llasram