【问题标题】:How to force script to close all opened files based on theirs directory?如何强制脚本根据他们的目录关闭所有打开的文件?
【发布时间】:2019-01-25 10:21:13
【问题描述】:

是否可以仅根据他们的目录关闭打开的文件?我想关闭具有特定扩展名的文件。如果不可能,我可以关闭所有打开的文件。我的代码已经变得很长,以至于我无法以其他方式控制文件的关闭。我正在为外部用户准备应用程序并且我开发了“重置”按钮,但是由于这些文件仍然打开,我在访问某些文件夹时遇到了问题。

我正在使用 psutil 来获取我的 .py 脚本打开的所有文件的列表。

[popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_48.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.shp', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\explorerframe.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\polygonSet1B.shp', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_idx.db', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\user32.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\thumbcache_idx.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.shx', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\PolygonSet1A.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\obszar_zainteresowania.dbf', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\dui70.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1B.dbf', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\polygonSet1B.dbf', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\shell32.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\propsys.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\thumbcache_96.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\obszar_zainteresowania.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\NetworkItemFactory.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\comdlg32.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\Fonts\\StaticCache.dat', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_256.db', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\PolygonSet1A.shp', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\windows.storage.dll.mui', fd=-1),
popenfile(path='D:\\jan\\apka_update\\temp\\17-Z1-20180704_Lk7_156.000-180.000_niepelne\\intersection1A.shx', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\mpr.dll.mui', fd=-1),
popenfile(path='C:\\Windows\\System32\\pl-PL\\KernelBase.dll.mui', fd=-1),
popenfile(path='C:\\Users\\Jan\\AppData\\Local\\Microsoft\\Windows\\Explorer\\iconcache_16.db', fd=-1)]    

【问题讨论】:

    标签: python python-3.x file psutil


    【解决方案1】:

    您可以使用内置的os.path 库或漂亮的path.py 来测试目录和扩展。

    for fname in my_files:
        _, ext = os.path.splitext(fname)
        dirname = os.path.join(fname, os.pardir)
    
        if ext=".txt" and dirname ="my_dir":
            # close your file
    

    或者,使用 path.py:

    for fname in my_files:
        fname = Path(fname)
        if fname.ext == ".txt" and fname.parent == "my_dir":
            # close your file
    

    【讨论】:

    • 感谢您的回复。我的问题是如何“关闭我的文件”?我知道如何将目录和文件名提取到具有特定扩展名的文件中,但我不知道在不使用 f.close() 的情况下如何关闭这些文件,因为我不知道在我的代码中定义 f 的位置。你知道我的意思吗?
    • 我在脚本的不同阶段反复打开同一个文件。当我在 .py 中列出所有打开的文件时,没有关于文件未关闭的阶段的信息。
    【解决方案2】:

    我的代码太长了,我无法以其他方式控制文件的关闭。

    然后是时候停止一切并修复您的代码了。实际上,您的代码应该在处理完每个文件后立即关闭它 (the with statement is your friend here),而且我很难想出任何理由让这么多文件同时打开。

    在所有情况下:您需要引用文件才能关闭它,句号。如果您打开一个文件,请不要关闭它并丢弃对该文件的引用,然后……太糟糕了。

    好的,最终可能会有一个非常丑陋的解决方法,将所有open() 调用替换为您自己的版本,该版本将打开的文件存储在某个全局列表中。但实际上,这只会让您的代码变得更糟,所以请做正确的事:修复您的代码以在正确的位置正确关闭文件。

    【讨论】:

      【解决方案3】:

      这样的事情应该可以解决问题。

      import psutil
      
      ## Close open processes matching the path.
      pathToClear = "{PATH GOES HERE}"
      
      print(f"...Searching for active processes matching path: '{pathToClear}'")
      for proc in psutil.process_iter(['name', 'open_files']):
          for file in proc.info['open_files'] or []:
              if pathToClear in file.path:
                  print(f"Found process potentiall process potentially locking path. Killing: '{proc.info['name']}'")
                  print("%-5s %-10s %s" % (proc.pid, proc.info['name'][:10], file.path))
                  proc.kill()
      
      print("Completed!")
      

      参考:

      【讨论】:

        猜你喜欢
        • 2014-08-20
        • 1970-01-01
        • 2014-03-01
        • 2011-01-16
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        相关资源
        最近更新 更多