Так что название немного длинное, но это единственное, что я не могу найти в Интернете, немного поискав. Как мне получить доступ к аргументу pass_fds из подпроцесса?

# parent.py
import subprocess

subprocess.Popen(['run', 'some', 'program'], pass_fds=(afd, bfd))

# child.py
import subprocess

# need to access pass_fds argument? but how?
2
Yakup Türkan 2 Янв 2018 в 22:43

2 ответа

Лучший ответ

Вам нужно явно сообщить дочернему элементу о переданных fds. Наиболее распространенные / простые механизмы:

  1. Через переменную окружения, установленную для ребенка
  2. Через аргумент, переданный ребенку
  3. (Реже, но возможно) Написано для ребенка stdin

Все это, конечно, требует сотрудничества ребенка; ему необходимо определить интерфейс, чтобы информировать его о переданных fds.

Инструмент командной строки openssl поддерживает все эти механизмы для аналогичной цели (передача ключевой фразы дочернему элементу без ввода ее в командную строку). Вы передаете -pass и второй аргумент, который определяет, где искать пароль. Если вторым аргументом является stdin, он читает из stdin, если -pass fd:# (где # - номер fd), он читает из произвольного предоставленного дескриптора файла, {{ X6}} (где var - имя переменной среды) читает из среды и т. Д.

4
ShadowRanger 2 Янв 2018 в 20:46

Возможно, это не лучший технический ответ, но я хотел покопаться в файловых дескрипторах. После вашего вопроса я сделал эти два сценария. Os создает канал, а родительский элемент отправляет дескрипторы дочернему элементу с помощью кортежа pass_fds. Дополнительная информация в документах по Python, os.read () описание. После этого родительский fdw передается в виде байтов в дочерний процесс и затем используется для отправки ответа.

Надеюсь, это поможет.

Редактировать: Нашел этот пост на форумах Google. .

##### child.py
import subprocess, os

fdr_data = os.read(3,20) # 3 is inherited by pass_fds    
fdw = int(fdr_data)      # 4

print("CHILD fdw = ", fdw , "\n")

os.write(fdw, bytes("some answer".encode())) 
exit()


##### parent.py
import subprocess, os, time

fdr, fdw = os.pipe() # new file descriptor read , fd write
print("PARENT", "fdr = ", fdr , " fdw = " , fdw)

subprocess.Popen(['python3','child.py'], pass_fds=(fdr, fdw))    
os.write(fdw, bytes("{}".format(fdw).encode())) # pipe file descriptor write (out 4)

time.sleep(1)   # so subproc can execute

read_pipe = os.read(fdr, 20) # pipe file descriptor read (in 3)    
print("PARENT" , read_pipe.decode())
0
Tomasz Wiśniewski 2 Янв 2018 в 22:56