Доступ к пространству имен Python из другого процесса Python

Допустим, у меня есть следующий скрипт Python script.py:

a = 1
b = 10

for i in range(b):
    a += 1

print(a)

Я знаю, что могу использовать globals() внутри этого script.py, чтобы показать пространство имен:

{'__file__': 'counter.py', '__doc__': None, 'i': 9, '__spec__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000027C8D9402E8>, '__name__': '__main__', '__cached__': None, 'b': 10, 'a': 11, '__package__': None, '__builtins__': <module 'builtins' (built-in)>}

Интересно, можно ли как-то подражать globals() из-за пределов script.py? Другими словами, я хочу запустить other_script.py и посмотреть результат script.pyglobals(). Является ли import counter чем-то полезным?

Обновлено: если возможно, можно ли обновлять вывод script.pyglobals с каждым приращением i в цикле for?

Можете ли вы дать более подробную информацию о развертывании? script.py и other_script.py запускаются отдельно (то есть как совершенно отдельные процессы) или вы предполагаете, что один запускает другой? Я не думаю, что в качестве полностью ускоренных процессов вы сможете многое сделать, но у вас могут быть некоторые варианты, если один из них является подпроцессом другого, использующим многопроцессорный модуль python.

Nidal 18.03.2019 12:55
script.py и other_script.py — совершенно разные процессы.
balkon16 19.03.2019 06:26

Это может быть проблемой, зависящей от ОС, поскольку вы хотите, чтобы один процесс обращался к памяти другого. Есть способы сделать это, но очень немногие простые. Мой совет — не изобретать велосипед: используйте базу данных (простое хранилище k/v должно подойти, как Redis) или настройте простой Http-сервер в своем хост-скрипте.

Nidal 19.03.2019 13:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
309
1

Ответы 1

Проблема с import counter заключается в том, что пространство имен внутри counter.py будет изменено на ваше текущее пространство имен, поскольку вы импортируете его в свое текущее пространство имен.

Однако, если все, что вы хотите сделать, это просто увидеть вывод counter.py, вы можете просто использовать функцию exec(), чтобы выполнить его отдельно. Это не изменит его пространство имен.

Пример:

В counter.py:

a = 1
b = 10

for i in range(b):
    print('\na = ', a)
    print('globals = ', globals())
    a += 1

print('\na = ', a)
print('globals = ', globals())

В other_script.py:

exec(open('counter.py').read())

Спасибо за ответ. Предположим, что в файле counter.py нет операторов печати. Можно ли еще увидеть значения переменных a, b и i? Текущий подход с exec(open('counter.py').read()) дает пустой вывод.

balkon16 19.03.2019 06:31

Другие вопросы по теме