好的,所以我正在开发一个应用程序,允许用户在菜单中选择文件对象,并允许他们将所选的选项复制到另一个位置。到目前为止,我设法使用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下实现相同的目标。
答案 0 :(得分:1)
你考虑过shutil(http://docs.python.org/library/shutil.html)吗?该模块提供了那种高级文件操作,同时保持了os-annostic。
答案 1 :(得分:1)
在Mac上执行此操作的另一种方法是使用NSWorkspace通过PyObjC。像这样:
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,这意味着您需要一个运行循环。
答案 2 :(得分:0)
在Mac上,您需要编写Finder脚本。
执行此操作的一种方法是使用ScriptingBridge。首先:
import ScriptingBridge
f = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")
然后......好吧,启动AppleScript编辑器,查看Finder的词典,找出如何将其从AppleScript转换为Python + ScriptingBridge,如果您有任何问题,请回来再问一遍。但这里有一些提示:
诀窍是从路径到Finder参考。并没有简单的方法直接到达那里。相反,你必须从startupDisk开始,在其上调用folders(),过滤name ==路径的第一个组件,然后重复。请参阅http://developer.apple.com/library/mac/#samplecode/ScriptingBridgeFinder/Listings/Controller_m.html(使用Objective C编写,而不是Python,但ScriptingBridge部分很容易翻译)。
答案 3 :(得分:0)
解决方案可能是特定于操作系统/桌面的;例如在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等,您可能需要为每个工作。
答案 4 :(得分:0)
我不羡慕这项任务。要做到这一点,你不是针对“Linux”,而是桌面环境X,Y,Z等(以及每个的不同版本)。它不仅仅是KDE与Gnome,它是KDE 3/4 vs Gnome 2/3 vs Enlightment vs Xfce4 vs Blackbox vs. TWM等。
您可以使用像GTK或WXwidgets这样的库来获取跨桌面文件选择器,但我认为其中任何一个都没有用于复制操作的进度窗口小部件(您必须自己编写代码)并且它们不会看起来像“原生”。
一般来说虽然我不认为本机拷贝对话框确实是大多数Linux用户会关心的东西。我们已经习惯了看起来与众不同的节目,我们会学会与之共处。
无论如何,我建议GtkProgressBar或wxProgressDialog,因为任何一个都应该相当容易地完成这个任务,并且两个库都有python绑定。