【问题标题】:Copying files with native file manager in python在python中使用本机文件管理器复制文件
【发布时间】:2012-06-26 14:04:13
【问题描述】:

好的,所以我正在开发一个应用程序,它允许用户在菜单中选择文件对象,并允许他们将所述选择复制到另一个位置。到目前为止,我已经设法使用 pywin32 模块来允许我使用 Windows 的本机文件复制器来复制文件。

它的代码:

from win32com.shell import shell, shellcon
srcstr = chr( 0 ).join( [ file[0] for file in files ] )
deststr = chr( 0 ).join( [ file[1] for file in files ] )
shell.SHFileOperation(
    ( 0, shellcon.FO_COPY, srcstr, deststr, shellcon.FOF_MULTIDESTFILES, None, None )
)

这是在 Windows 下复制的好方法,但我想知道是否有办法在 Mac 和/或 Linux 下实现相同的目标。

【问题讨论】:

  • 您是否只需要复制文件或元数据?
  • 确实-从您的问题中,我感觉您也想要元数据,否则您可以使用shutil:docs.python.org/library/shutil.html
  • 我并不真正关心元数据,我只是不希望由 Python 处理实际的复制;我想将其卸载到文件管理器。 (我面临的问题是我只知道如何在 Windows 上执行此操作)

标签: python copy cross-platform pywin32 win32com


【解决方案1】:

你考虑过shutil (http://docs.python.org/library/shutil.html)吗?该模块提供了这种高级文件操作,同时保持与操作系统无关。

【讨论】:

  • 是的,但我正在寻找一种可以使用操作系统的图形文件管理器来复制文件的解决方案。例如,这就是示例代码在 Windows 7 上运行的样子; example_image
  • 对于 MAC,您可以查看 PyObjC。对于 Linux,您不会找到一种适用于所有人的解决方案,因为有很多不同的发行版,并且每个发行版的 GUI 都不同。
  • 嗯,我什至没有考虑过使用 PyObjC ......由于我最常使用 Ubuntu,因此我可能只会查找 nautilus 的控制台界面。无论如何,谢谢!
【解决方案2】:

在 Mac 上执行此操作的另一种方法是通过 PyObjC 使用 NSWorkspace。像这样:

from Cocoa import *
ws = NSWorkspace.sharedWorkspace()
ws.performFileOperation_source_destination_files_tag_(NSWorkspaceCopyOperation,
    '/dirname/of/source', '/dest/directory', ['basenameOfSource'], None)

问题在于,这实际上并不能保证与 Finder 做同样的事情。对于大副本,通常会,但对于较小的副本,可能根本没有反馈。

另外,如果你想得到任何反馈,你必须存储 ret[1] 并注册 NSWorkspace 通知 NSWorkspaceDidPerformFileOperationNotification,这意味着你需要一个运行循环。

【讨论】:

    【解决方案3】:

    在 Mac 上,您需要编写 Finder 脚本。

    一种方法是使用 ScriptingBridge。开始:

    import ScriptingBridge
    f = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")
    

    然后……好吧,启动 AppleScript Editor,查看 Finder 的字典,并弄清楚如何将 AppleScript 翻译成 Python+ScriptingBridge,如果您有任何问题,请再回来询问。但这里有一些提示:

    诀窍是从路径中获取 Finder 引用。而且没有简单的方法可以直接到达那里。相反,您必须从 startupDisk 开始,在其上调用文件夹(),过滤 name == path 的第一个组件,然后重复。请参阅http://developer.apple.com/library/mac/#samplecode/ScriptingBridgeFinder/Listings/Controller_m.html(它是用 Objective C 而非 Python 编写的,但 ScriptingBridge 部分很容易翻译)。

    【讨论】:

    • 考虑到尝试为每个 Linux 发行版提供替代方案的艰巨任务,这似乎并不需要太多工作。 (让我翻白眼)我只是将 Linux 留给后备并专注于 Mac,所以我肯定会在明天的某个时候研究这个问题。非常感谢!
    【解决方案4】:

    解决方案可能是特定于操作系统/桌面的;例如在 GNOME 上,您需要使用 DBus 与 Nautilus 进行通信。

    有人询问文档,显然没有:Where to find information about Nautilus D-Bus interface

    并且此线程表明您需要的功能可能存在于当前版本的 Nautilus 中: https://askubuntu.com/questions/52093/how-can-i-initiate-nautilus-file-operations-from-the-command-line

    但要支持 OS X、KDE ​​等,您可能必须为每个工作做一些工作。

    【讨论】:

      【解决方案5】:

      我不羡慕这项任务。为了实现这一点,您并不是针对“Linux”,而是针对桌面环境 X、Y、Z 等(以及每个环境的不同版本)。不仅仅是 KDE 与 Gnome,还有 KDE 3/4 与 Gnome 2/3 与 Enlightment 与 Xfce4 与 Blackbox 与 TWM 等。

      您可以使用 GTK 或 WXwidgets 之类的库来获得跨桌面文件选择器,但我认为它们中的任何一个都没有用于复制操作的进度小部件(您必须自己编写代码)而且它们没有看起来也很“原生”。

      一般来说,虽然我不认为本机复制对话框真的是大多数 linux 用户会关心的事情。我们已经习惯了看起来不同的程序,并且我们学会了接受它。

      无论如何,我推荐GtkProgressBarwxProgressDialog,因为这两个库都应该相当容易完成这项任务,而且两个库都有 python 绑定。

      【讨论】:

      • 好吧,我已经在纯 python 中编写了一个备用代码,这是一件好事,因为这对于我正在制作的实用程序来说似乎工作量太大。 (而且后备的进度条也很好看……)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2015-04-02
      • 2014-07-13
      • 2014-11-18
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多