使用Python的怪异行为3子流程.Popen以及引用之间的争论

2024-06-01 05:22:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个以路径为参数的项目,我使用Tivoli Storage Manager(TSM)执行路径树的分段备份。 到现在为止,一直都还不错。你知道吗

当我尝试用空格备份路径时,我发现了一个奇怪的行为。 当我使用TSM时,我把路径放在引号中,这样做很好。 另一方面,在python(3.5.2)上,当我尝试使用子流程.Popen,tsm告诉我找不到路径。奇怪的行为是它将参数路径与当前目录连接起来。你知道吗

再一次:它只在处理带有空格的路径时出现,即“/appdata/mtmradar/ixd/Autos e Ar/07\u 821\u 261\u 6/”

我已经读过一些问题,比如16114713。你知道吗

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

我正在aix7.2上使用python3.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

Tags: of路径client参数usrappdataarpopen
1条回答
网友
1楼 · 发布于 2024-06-01 05:22:25

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

AIX是一个Unix,因此当您在命令中引用一个参数时,引号由shell解释,shell实际上通过(一个库函数调用)execve将删除引号的参数传递给命令。如果您想从Python中模拟它,那么当您将任何参数作为iterable传递时,您不应该引用它们。如果这样做,该命令将收到一个带引号的字符串,而不是预期的字符串。你知道吗

错误是由参数以双引号"而不是斜杠/开头引起的。只有以斜杠开头的路径才是绝对路径,任何其他初始字符(include")都会导致它被解释为相对路径,从而导致连接。你知道吗

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

相关问题 更多 >