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
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
Liées Python question: Ne pas utiliser une liste d'argument en collaboration avec shell=True dans la sous-processus' docs
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
Vous devez vous connecter pour publier un commentaire.
subprocess
's règles pour la manipulation de l'argument de la commande sont en réalité un peu plus complexe.De les docs:
Avec
shell=False
:Avec
shell=True
:(tout l'accent de la mine)
Recommandé des moyens "pour le moins surprenant". Vous pouvez faire de la non-recommandé chose - le code ne sera pas vous arrêter - et les résultats seront consignés dans les extraits que j'ai cités.
Pour moi, l'utilisation de shell=True et passage de liste au lieu de la chaîne totalement rompu, à moins que la liste a un seul élément (c'est à dire pas d'arguments).
OriginalL'auteur nneonneo