Просмотр переменных другого файла Python без импорта / запуска - PullRequest
0 голосов
/ 30 июня 2018

Я уже некоторое время пытаюсь читать файлы Python и печатать его переменные. Можно ли просматривать и распечатывать переменные другого файла без импорта или запуска? Все, что я уже искал, объясняет только, как импортировать или использовать execfile и т. Д. (Отказ от ответственности, я, вероятно, туп)

Это то, что я имею до сих пор:

for vars in dir():
   print(vars)

Теперь, это прекрасно работает для файла, из которого он запускается, но когда я пытаюсь этот код:

for vars in file:
   print(vars)

(файл просто path.read ())

Ну, это дает мне каждый символ файла в новой строке. Я понятия не имею, является ли мой цикл правильным. Придется ли мне писать что-то, что будет вручную находить каждую переменную, а затем добавлять ее в список?

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Прежде всего, вы не глупы, просто не так много людей должны это делать. Кроме того, я не могу придумать, как переместить переменные в отдельный json-файл или файл pickle, а затем загрузить его позже в обеих программах, используя json.load(filename) или что-то в этом роде. Но это работает, только если оно не изменяется, пока другая программа его оценивает.

0 голосов
/ 30 июня 2018

Используйте ast.parse для синтаксического анализа кода, рекурсивного обхода узлов путем итерации по тем, у кого есть атрибут body (которые являются блоками кода), найдите объекты Assign и получите их targets (которые являются переменными присваивать значения, которые вы ищете) и получить их атрибут id, если они Name объекты.

Попробуйте следующий код после замены file.py именем файла скрипта python, который вы хотите проанализировать.

import ast
import _ast

def get_variables(node):
    variables = set()
    if hasattr(node, 'body'):
        for subnode in node.body:
            variables |= get_variables(subnode)
    elif isinstance(node, _ast.Assign):
        for name in node.targets:
            if isinstance(name, _ast.Name):
                variables.add(name.id)
    return variables

print(get_variables(ast.parse(open('file.py').read())))
0 голосов
/ 30 июня 2018

Нет ... и да.

Вопрос в том, являются ли «переменные» постоянными или истинными переменными.

Python запускает сборщик мусора. Он создаст переменные при запуске / импорте модуля. Эти переменные будут иметь область видимости в зависимости от того, как они используются. Когда они больше не используются, сборщик мусора удалит объекты из памяти.

Если переменной присвоено фиксированное значение (например, i = 1), тогда вы можете просто прочитать файл, как если бы он был текстовым файлом - так как это текстовый файл. Если вы хотите изменить эти переменные, вы можете просто записать их в виде текстового файла. Вам будет необходимо отслеживать переменные в тексте, точно так же, как при любом сопоставлении текста.

Если переменные генерируются как часть кода, то нет (например, он генерирует список файлов в каталоге и присваивает их переменной). Вам нужно будет либо импортировать модуль, либо изменить модуль так, чтобы он экспортировал выходные данные в отдельный файл - например, CSV - и тогда вы можете прочитать файл данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...