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

上記の2行目に注意してください。print argsこれは、内のコマンドの結果main()です。argsリスト['\\\\Hal\\hal free agent 1\\backups\\videos" out.txt']には2つではなく1つの要素しかないと言っています。これは私には意味がありません。

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']

末尾のバックスペースは、の直前にあるためエスケープ文字として解釈され"ます。これにより、引数が単一の文字列に変換されます(またはエスケープされていない文字列が検出されるまで")。

于 2012-08-20T18:22:16.230 に答える