【问题标题】:How to import and get variables from another python file?如何从另一个 python 文件导入和获取变量?
【发布时间】:2018-07-05 08:18:48
【问题描述】:

主文件为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()

我正在尝试在 aaa.py 中使用 get_newest_folder.py 中的变量“path”和“newest_folder”,因此我导入了“get_newest_folder”。但我无法获取(打印)aaa.py 中的 2 个变量。当我运行 aaa.py 时,它显示如下错误消息:

NameError: name 'newest_folder' 未定义

有人可以更正我的代码或给我一些建议吗? 非常感谢。

【问题讨论】:

    标签: python variables import


    【解决方案1】:

    修改你的 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()
    

    【讨论】:

      【解决方案2】:

      为了访问 latest_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()
      

      【讨论】:

        【解决方案3】:

        首先,要回答你的问题,你需要修改你的模块:

        import os
        
        newest_folder = ''         # <<<<
        path = ''                  # <<<<
        
        def get_n_folder():
            global newest_folder   # <<<<
            global path            # <<<<
        
            ....
            # The rest is unchanged
        

        变量现在是模块的属性,以前它们只是函数的属性。

        这样就消除了错误消息,但它只打印了两个空白行!!!为什么?由于newest_folderpath 尚未设置,因此您无需调用该函数来填充值!

        这是一个问题,另一个是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()
        

        【讨论】:

          猜你喜欢
          • 2021-04-17
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-22
          相关资源
          最近更新 更多