【问题标题】:rsync filters failing when executed with python subprocess.run()rsync 过滤器在使用 python subprocess.run() 执行时失败
【发布时间】:2018-02-01 18:08:19
【问题描述】:

我有一个稍微复杂的rsync 命令,需要由python 程序定期执行。

enter code here

该命令可以从命令行正确执行,但是当使用subprocess.run() 运行时,包含/排除过滤器似乎被忽略了。

该命令旨在通过ssh 在一对Raspberry Pi3 之间同步某些数据文件。 Pi 在 Raspbian jessie 下运行 Python 3.5.2rsync 3.11

这是我从 ipython 会话执行的测试代码。

In [3]: def testrsync():
   ...:     from subpro`enter code here`cess import run
   ...:     cmd = ("rsync -avzhe ssh -i --include='*.zip' --include='data.csv' "
   ...:            "--exclude='*' pi@192.168.1.122:/home/pi/pgcdata/ "
   ...:            "/tmp/pgcdata")
   ...:     cmdlist = cmd.split()
   ...:     print(cmd)
   ...:     ret  = run(cmdlist, shell=False)
   ...:     print(ret)
   ...:
   ...:

In [4]: testrsync()
rsync -avzhe ssh -i --include='*.zip' --include='data.csv' --exclude='*' pi@192.168.1.122:/home/pi/pgcdata/ /tmp/pgcdata
receiving incremental file list
created directory /tmp/pgcdata
cd+++++++++ ./
>f+++++++++ data-2018-01-24.csv.zip
>f+++++++++ data-2018-01-25.csv.zip
>f+++++++++ data-2018-01-26.csv.zip
>f+++++++++ data-2018-01-27.csv.zip
>f+++++++++ data-2018-01-28.csv.zip
>f+++++++++ data-2018-01-29.csv.zip
>f+++++++++ data-2018-01-30.csv.zip
>f+++++++++ data-2018-01-31.csv
>f+++++++++ data.csv
>f+++++++++ four-hour-plot.csv
>f+++++++++ one-day-plot.csv
>f+++++++++ seven-day-plot.csv
>f+++++++++ thirty-day-plot.csv

sent 312 bytes  received 731.54K bytes  162.63K bytes/sec
total size is 35.49M  speedup is 48.49
CompletedProcess(args=['rsync', '-avzhe', 'ssh', '-i', "--include='*.zip'", "--include='data.csv'", "--exclude='*'", 'pi@192.168.1.122:/home/pi/pgcdata/', '/tmp/pgcdata'], returncode=0)

上面的最后四个文件不应该被复制。如果我清空目标目录,复制打印的 rsync 命令并将其作为 shell 命令运行,则会发生过滤并且只复制所需的文件。

In [5]: !rm -rf /tmp/pgcdata/

In [6]: !rsync -avzhe ssh -i --include='*.zip' --include='data.csv' --exclude='*' pi@192.168.1.122:/home/pi/pgcdata
   ...: / /tmp/pgcdata
receiving incremental file list
created directory /tmp/pgcdata
cd+++++++++ ./
>f+++++++++ data-2018-01-24.csv.zip
>f+++++++++ data-2018-01-25.csv.zip
>f+++++++++ data-2018-01-26.csv.zip
>f+++++++++ data-2018-01-27.csv.zip
>f+++++++++ data-2018-01-28.csv.zip
>f+++++++++ data-2018-01-29.csv.zip
>f+++++++++ data-2018-01-30.csv.zip
>f+++++++++ data.csv

【问题讨论】:

    标签: python-3.x subprocess rsync


    【解决方案1】:

    问题在于过滤器模式周围的单引号。它们对于防止 shell 扩展模式和 shell 在 rsync 看到它们之前去掉引号是必要的。

    Subprocess.runshell=False 不会去掉引号,而rsync,祝福它的小心脏,不会抱怨。所以模式最终没有效果,一切都被复制了。

    当我将命令字符串更改为:

    cmd = ("rsync -avzhe ssh -i --include=*.zip --include=data.csv "
           "--exclude=* pi@192.168.1.122:/home/pi/pgcdata/ "
           "/tmp/pgcdata")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多