奇怪的行为使用python3 subprocess.Popen和引号之间的参数

时间:2017-07-18 14:51:33

标签: python subprocess

我有一个项目,我将路径作为参数并使用Tivoli Storage Manager(TSM),我执行该路径树的分段备份。 到目前为止一切都很好。

当我尝试使用空格备份路径时,我发现了一种奇怪的行为。 当我使用TSM时,我将路径放在引号中,并且工作正常。 另一方面,在python(3.5.2)上,当我尝试使用subprocess.Popen执行命令时,tsm告诉我无法找到路径。奇怪的行为是它将参数路径与当前目录连接起来。

再一次:它只在处理带空格的路径时才会出现问题,即" / appdata / mtmradar / ixd / Autos e Ar / 07_821_261_6 /"

我已经阅读了一些问题,例如16114713

顺便说一句,我发现当使用删除引号列表时我可以正确执行命令。 我的问题是:为什么它将我当前的路径与参数路径连接起来?

我在AIX 7.2上使用Python 3.5.2。 完整的命令是:

>>> from subprocess import Popen
>>> with Popen(['/usr/bin/dsmc', 'i', '-quiet', '-optfile=/usr/tivoli/tsm/client/ba/bin64/dsm-NAS-SDER00019.opt', '-sub=yes', '"/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/"']) as proc:
...     pass
... 

这就是我得到的:

IBM Tivoli Storage Manager
Command Line Backup-Archive Client Interface
  Client Version 7, Release 1, Level 3.0 
  Client date/time: 07/18/17   10:37:54
(c) Copyright by IBM Corporation and other(s) 1990, 2015. All Rights Reserved.

Node Name: NAS-SDER00019
Session established with server CELBKP03: AIX
  Server Version 7, Release 1, Level 4.100
  Server date/time: 07/18/17   10:38:04  Last access: 07/18/17   10:27:03


Incremental backup of volume '"/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/"'
ANS1076E The specified directory path '/usr/tivoli/tsm/client/ba/bin64/tsm_seg_bkp_python/NAS-SDER00019/"/appdata/mtmradar/ixd/Autos\ e\ Ar/07_821_261_6/"' could not be found.

在路径上没有双引号的情况下执行相同的命令,我没有错误:

>>> with Popen(['/usr/bin/dsmc', 'i', '-quiet', '-optfile=/usr/tivoli/tsm/client/ba/bin64/dsm-NAS-SDER00019.opt', '-sub=no', '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/']) as proc:
...     pass 
... 

这是输出:

IBM Tivoli Storage Manager
Command Line Backup-Archive Client Interface
[...]
Incremental backup of volume '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/'
Successful incremental backup of '/appdata/mtmradar/ixd/Autos e Ar/07_821_261_6/*'
Total number of objects inspected:            4
[...]
Total data reduction ratio:              100.00%
Elapsed processing time:               00:00:01

1 个答案:

答案 0 :(得分:0)

欢迎来到引用字符串处理的天堂世界! ; - )

AIX是Unix,因此当您向命令引用参数时,shell会解释引号,并且shell实际将参数的引号已删除传递给命令(库)函数调用)execve。如果你想用Python模仿它,当你把它们作为一个可迭代的传递时,你不应该引用任何参数。如果这样做,该命令将接收一个不符合预期的带引号的字符串。

错误是由以双引号"开头的参数而不是斜杠/引起的。只有以斜杠开头的路径才是绝对路径,任何其他初始字符(包括")都会将其解释为相对路径,因此连接。

所以问题的答案是:因为参数不是以/开头,而是",所以它是连接到当前路径的相对路径