sous-processus.appel à l'aide de la chaîne de vs en utilisant la liste des

Je suis en train d'utiliser rsync avec des sous-processus.appel. Bizarrement, ça fonctionne si je passe sous processus.appel d'une chaîne, mais il ne fonctionnera pas avec une liste (ala, Python doc).

l'appel de sp.appel à une chaîne de caractères:

In [23]: sp.call("rsync -av content/writings_raw/", shell=True)
sending incremental file list

sent 6236 bytes  received 22 bytes  12516.00 bytes/sec
total size is 324710  speedup is 51.89
Out[23]: 0

l'appel de sp.appel d'une liste:

In [24]: sp.call(["rsync", "-av", "content/", "writings_raw/"], shell=True)
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
append, ACLs, xattrs, iconv, symtimes
rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.
Usage: rsync [OPTION]... SRC [SRC]... DEST
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST
or   rsync [OPTION]... [USER@]HOST:SRC [DEST]
or   rsync [OPTION]... [USER@]HOST::SRC [DEST]
or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name.
Options
-v, --verbose               increase verbosity
-q, --quiet                 suppress non-error messages
--no-motd               suppress daemon-mode MOTD (see manpage caveat)
... snipped....
repeated: --filter='- .rsync-filter'
--exclude=PATTERN       exclude files matching PATTERN
--blocking-io           use blocking I/O for the remote shell
-4, --ipv4                  prefer IPv4
-6, --ipv6                  prefer IPv6
--version               print version number
(-h) --help                  show this help (-h is --help only if used alone)
...snipped ...
rsync error: syntax or usage error (code 1) at main.c(1438) [client=3.0.9]
Out[24]: 1

Quel est le problème avec la façon dont j'utilise la liste? Comment voulez-vous résoudre ce problème? J'ai besoin de la liste, parce que je tiens à utiliser des variables. Bien sûr, je pourrais utiliser:

  sp.call("rsync -av "+Orig+" "+Dest, shell=True)    

Mais je voudrais comprendre comment les sous-processus comprend des listes vs chaînes.

avec la mise en coquille=False

In [36]: sp.call(['rsync', '-av', ORIG, DEST], shell=False)
sending incremental file list
sent 6253 bytes  received 23 bytes  12552.00 bytes/sec
total size is 324710  speedup is 51.74
Out[36]: 0

est=False et chaîne

In [38]: sp.call("rsync -av"+" "+ORIG+" "+DEST, shell=False)
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-38-0d366d3ef8ce> in <module>()
----> 1 sp.call("rsync -av"+" "+ORIG+" "+DEST, shell=False)
/usr/lib/python2.7/subprocess.pyc in call(*popenargs, **kwargs)
491     retcode = call(["ls", "-l"])
492     """
--> 493     return Popen(*popenargs, **kwargs).wait()
494 
495 
/usr/lib/python2.7/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
677                             p2cread, p2cwrite,
678                             c2pread, c2pwrite,
--> 679                             errread, errwrite)
680 
681         if mswindows:
/usr/lib/python2.7/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
1257                     if fd is not None:
1258                         os.close(fd)
-> 1259                 raise child_exception
1260 
1261 
OSError: [Errno 2] No such file or directory
Le changement de comportement lorsque vous définissez shell=False (que vous devriez faire si True n'est pas explicitement requis)?
Oui il change. Mais ce qui me rend encore plus confus.... parce que avec shell=False et de la chaîne, il est exactement à l'opposé. Donc ce qui se passe ici?
Il est facile. Le shell veut une chaîne de caractères, donc lui en donner une. Si vous n'utilisez pas le shell, le système de la famille d'appel exec*() est utilisé, qui veulent les paramètres à split - alors, donnez-lui une liste.
Liées Python question: Ne pas utiliser une liste d'argument en collaboration avec shell=True dans la sous-processus' docs

OriginalL'auteur Oz123 | 2013-02-27