Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用本机文件管理器复制文件_Python_Copy_Cross Platform_Pywin32_Win32com - Fatal编程技术网

在python中使用本机文件管理器复制文件

在python中使用本机文件管理器复制文件,python,copy,cross-platform,pywin32,win32com,Python,Copy,Cross Platform,Pywin32,Win32com,好的,我正在开发一个应用程序,允许用户在菜单中选择文件对象,并允许他们将所述选择复制到另一个位置。到目前为止,我已经设法使用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

好的,我正在开发一个应用程序,允许用户在菜单中选择文件对象,并允许他们将所述选择复制到另一个位置。到目前为止,我已经设法使用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()吗?此模块提供了此类高级文件操作,同时保持操作系统无关性。

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

一种方法是使用ScriptingBridge。首先:

import ScriptingBridge
f = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")
然后,启动AppleScript编辑器,查看Finder的字典,找出如何将它从AppleScript翻译成Python+ScriptingBridge,如果您有任何问题,请再次询问。但这里有一些提示:


诀窍是从一条路径到查找器引用。直接去那里没有简单的方法。相反,您必须从startupDisk开始,在其上调用folders(),筛选name==路径的第一个组件,然后重复。请参阅(它是用Objective C编写的,不是Python,但是ScriptingBridge部分很容易翻译)。

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

有人问起文档,显然没有:

此线程表示您需要的功能可能存在于Nautilus的当前版本中:


但是要支持OSX、KDE等,您可能需要为每一个都做一些工作。

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

您可以使用诸如GTK或WXwidgets之类的库获得一个跨桌面文件选择器,但我认为这两个库都没有用于复制操作的进度小部件(您必须自己编写),而且它们看起来也不是“本地”的

一般来说,虽然我不认为本机复制对话框是大多数linux用户真正关心的东西。我们习惯了看起来不一样的节目,我们学会了接受它


无论如何,我建议使用or,因为这两个库都很容易完成此任务,而且两个库都有python绑定。

在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,这意味着您需要一个运行循环。

您是否也需要复制文件或元数据?事实上,从您的问题中,我感觉您也需要元数据,否则您可以使用shutil:我并不真正关心元数据,我只是不希望实际的复制由Python处理;我想把它转移到文件管理器。(我面临的问题是,我只知道如何在Windows上执行此操作)是的,但我正在寻找一种解决方案,该解决方案将使用操作系统的图形文件管理器来复制文件。例如,这就是运行在Windows7上的示例代码的样子;对于MAC,您可以查看。对于Linux,你不会找到一个适合所有人的解决方案,因为有很多不同的发行版,每个发行版的GUI都不同。嗯,我甚至没有想过使用PyObjC。。。我对Linux也有同样的想法;我可能会查找nautilus的控制台界面,因为我使用Ubuntu最多。无论如何谢谢你!很好,我已经用纯python编写了一个回退代码,因为这对于我正在开发的实用程序来说似乎太多了。(回退的进度条看起来也很不错……)考虑到为每个Linux发行版提供替代品的艰巨任务,这似乎不是太多工作。(让我眼花缭乱)我将把Linux留给后援,专注于Mac,所以我肯定会在明天某个时候研究这个问题。非常感谢你!