2

__doc__我喜欢在我的使用字符串中给我的用户一个例子。以下是与我的问题相关的代码的重要部分。

# jmetadata.py
'''
usage:     jmetadata.py inDirPath outFilePath
example:   jmetadata.py "\\\\Hal\\hal free agent 1\\backups\\videos\\" out.txt
'''

<...deleted code...>

def forPyWinTests():
    jmetadata("\\\\Hal\\hal free agent 1\\backups\\videos\\", "out.txt")

NUM_ARGS = 2
def main():
    args = sys.argv[1:]
    print args
    if len(args) != NUM_ARGS or "-h" in args or "--help" in args:
        print __doc__
        sys.exit(2)
    jmetadata(args[0], args[1])

if __name__ == '__main__':
    main()
    # print()
    # forPyWinTests()

我期望这种行为:

>jmetadata.py
[]

usage:     jmetadata.py inDirPath outFilePath
example:   jmetadata.py "\\Hal\hal free agent 1\backups\videos\" out.txt


>

但是,当我将示例复制到命令行时,我希望程序能够运行。相反,我得到:

>jmetadata.py "\\Hal\hal free agent 1\backups\videos\" out.txt
['\\\\Hal\\hal free agent 1\\backups\\videos" out.txt']

usage:     jmetadata.py inDirPath outFilePath
example:   jmetadata.py "\\Hal\hal free agent 1\backups\videos\" out.txt

注意上面的第二行。这是由print args里面的命令产生的main()。它是说 args 列表只有 1 个元素,['\\\\Hal\\hal free agent 1\\backups\\videos" out.txt']而不是 2。这对我来说没有意义。

我通过编写一个 Windows .cmd 文件进行了更多调查。这是 show_args.cmd:

rem show_args.cmd
echo %1 
echo %2

这是运行的结果:

>show_args.cmd "\\Hal\hal free agent 1\backups\videos\" out.txt

>rem show_args.cmd

>echo "\\Hal\hal free agent 1\backups\videos\"
"\\Hal\hal free agent 1\backups\videos\"

>echo out.txt
out.txt

Windows 似乎将这些项目分开。我难住了。有谁知道这里发生了什么?

我希望有人有一些见解可以分享。提前致谢。

4

1 回答 1

2

尝试删除尾部反斜杠。改变这个:

jmetadata.py "\\Hal\hal free agent 1\backups\videos\" out.txt

对此:

jmetadata.py "\\Hal\hal free agent 1\backups\videos" out.txt

在上面的测试运行中,Python 看到的参数是:

['\\\\Hal\\hal free agent 1\\backups\\videos" out.txt']

尾随退格被解释为转义字符,因为它紧接在 a 之前",这会将您的参数转换为单个字符串(或直到"遇到未转义的字符串)。

于 2012-08-20T18:22:16.230 回答