Как импортировать и получить переменные из другого файла Python? - PullRequest
0 голосов
/ 05 июля 2018

Основной файл aaa.py, код как показано ниже:

import os,time
from get_newest_folder import *

def main_test():
    print(newest_folder)
    print(path)

if __name__ == '__main__':
    get_n_folder()
    main_test()

Другой файл - get_newest_folder.py, код которого приведен ниже:

import os

def get_n_folder():

    path = 'D:\\Test'    
    os.chdir(path)
    files = sorted(os.listdir(os.getcwd()), key=os.path.getmtime)

    newest_folder = files[-1]
    return (path, newest_folder)

if __name__ == '__main__':
    get_n_folder()

Я пытаюсь использовать переменные "path" и "newest_folder" из get_newest_folder.py в aaa.py, поэтому я импортирую "get_newest_folder". Но я не могу получить (распечатать) 2 переменные в aaa.py. При запуске aaa.py:

отображается сообщение об ошибке, как показано ниже.

NameError: имя 'newest_folder' не определено

Кто-нибудь может исправить мой код или дать мне какое-нибудь предложение? Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

изменить ваш aaa.py

import os,time
from get_newest_folder import *

def main_test():
    path,newest_folder = get_n_folder()
    print(newest_folder)
    print(path)

if __name__ == '__main__':
    main_test()
0 голосов
/ 05 июля 2018

Прежде всего, чтобы ответить на ваш вопрос, вам необходимо изменить свой модуль:

import os

newest_folder = ''         # <<<<
path = ''                  # <<<<

def get_n_folder():
    global newest_folder   # <<<<
    global path            # <<<<

    ....
    # The rest is unchanged

Переменные теперь являются атрибутами модуля, ранее они были только атрибутами функции.

Так что избавился от сообщений об ошибках, но он просто печатает две пустые строки !!! Зачем? Поскольку newest_folder и path не были настроены, вы не вызываете функцию для заполнения значений!

Это одна проблема, другая - from get_newest_folder import *. Не делайте этого - это загрязняет ваше собственное пространство имен. Это дает возможность модулю перезаписывать ваши собственные переменные (столкновение пространства имен). Хорошо, вы знаете этот модуль, но будете ли вы всегда? Вы знаете очень переменную в каждом импортируемом модуле?

Итак:

import get_newest_folder

def main_test():
    print(get_newest_folder.newest_folder)
    print(get_newest_folder.path)

if __name__ == '__main__':
    get_newest_folder.get_n_folder()
    main_test()

Но, как уже говорили другие, лучше не делить переменные, если вы делаете это, это означает, что реализация модуля не может измениться - она ​​нарушает инкапсуляцию . Есть несколько случаев, когда это может быть оправдано, но не здесь.

Вместо этого, используя оригинал get_newest_folder.py:

import os,time
import get_newest_folder

def main_test():
    print(newest_folder)
    print(path)

if __name__ == '__main__':
    print(dir())
    newest_folder, path = get_newest_folder.get_n_folder()
    main_test()
0 голосов
/ 05 июля 2018

Чтобы получить доступ к newest_folder и path, вы должны объявить их как глобальные в get_newest_folder.py и импортировать эти переменные в aaa.py. В настоящее время они являются локальными переменными.

Но это не идеальный способ разобраться с вещами. Может быть, вам нужно что-то вроде этого

import os,time
from get_newest_folder import *

def main_test():
    _path, _newest_folder = get_n_folder()
    print(_path)
    print(_newest_folder)

if __name__ == '__main__':
    main_test()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...