Так что название немного длинное, но это единственное, что я не могу найти в Интернете, немного поискав. Как мне получить доступ к аргументу 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 ответа
Вам нужно явно сообщить дочернему элементу о переданных fds. Наиболее распространенные / простые механизмы:
- Через переменную окружения, установленную для ребенка
- Через аргумент, переданный ребенку
- (Реже, но возможно) Написано для ребенка
stdin
Все это, конечно, требует сотрудничества ребенка; ему необходимо определить интерфейс, чтобы информировать его о переданных fds.
Инструмент командной строки openssl
поддерживает все эти механизмы для аналогичной цели (передача ключевой фразы дочернему элементу без ввода ее в командную строку). Вы передаете -pass
и второй аргумент, который определяет, где искать пароль. Если вторым аргументом является stdin
, он читает из stdin
, если -pass fd:#
(где #
- номер fd), он читает из произвольного предоставленного дескриптора файла, {{ X6}} (где var
- имя переменной среды) читает из среды и т. Д.
Возможно, это не лучший технический ответ, но я хотел покопаться в файловых дескрипторах. После вашего вопроса я сделал эти два сценария. 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())
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.