Se il tuo obiettivo è una finestra di dialogo copia fantasia, la funzione API di Windows SHFileOperation lo fornisce. Il pacchetto pywin32 ha un collegamento Python per esso, anche i ctypes sono un'opzione (per esempio "SHFileOperation SHFile" per gli esempi).
Qui è la mia (molto leggermente testato) Esempio con pywin32:
import os.path
from win32com.shell import shell, shellcon
def win32_shellcopy(src, dest):
"""
Copy files and directories using Windows shell.
:param src: Path or a list of paths to copy. Filename portion of a path
(but not directory portion) can contain wildcards ``*`` and
``?``.
:param dst: destination directory.
:returns: ``True`` if the operation completed successfully,
``False`` if it was aborted by user (completed partially).
:raises: ``WindowsError`` if anything went wrong. Typically, when source
file was not found.
.. seealso:
`SHFileperation on MSDN <http://msdn.microsoft.com/en-us/library/windows/desktop/bb762164(v=vs.85).aspx>`
"""
if isinstance(src, basestring): # in Py3 replace basestring with str
src = os.path.abspath(src)
else: # iterable
src = '\0'.join(os.path.abspath(path) for path in src)
result, aborted = shell.SHFileOperation((
0,
shellcon.FO_COPY,
src,
os.path.abspath(dest),
shellcon.FOF_NOCONFIRMMKDIR, # flags
None,
None))
if not aborted and result != 0:
# Note: raising a WindowsError with correct error code is quite
# difficult due to SHFileOperation historical idiosyncrasies.
# Therefore we simply pass a message.
raise WindowsError('SHFileOperation failed: 0x%08x' % result)
return not aborted
È inoltre possibile eseguire la stessa operazione di copia in "modalità silenziosa" (senza dialogo, senza confirmationsm, nessun pop-up di errore) se si imposta le bandiere sopra a shellcon.FOF_SILENT | shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI | shellcon.FOF_NOCONFIRMMKDIR.
Vedere SHFILEOPSTRUCT per i dettagli.
fonte
2013-06-01 09:18:25
Avete in realtà cronometrato i trasferimenti di file dello stesso file utilizzando sia Python e Windows Explorer? Ho difficoltà a credere che Python sia effettivamente più lento. –
Sì, ho fatto un test fianco a fianco. È attraverso una rete, quindi forse la velocità della rete stava interferendo, ma come faccio a trovare le velocità di trasferimento con shutil? – tylerART
Si potrebbe usare 'time.clock()' in Python per ottenere il tempo di trasferimento, ma si dovrebbe usare un cronometro per il tempo Explorer. La mia supposizione sarebbe che sia Python che Explorer eseguono la stessa chiamata di libreria per eseguire la copia, ma Explorer si sente più veloce a causa della barra di avanzamento e forse a causa di alcune stime di tempo errate fornite. Se hai eseguito entrambi nello stesso momento e hai riscontrato enormi differenze, è piuttosto interessante! –