コードには少なくとも2つの問題があります。
call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])
まず、あなたは":q"
あなたが意図した場所を持っています"q:"
。これにより、net
コマンドがターゲットドライブではなくネットワークの場所として解釈:q
され、エラー67が発生する可能性があります。
次に、URLの周りに追加の引用符のセットがあります:'"http://na.com/DMP/DMP/programming/"'
使用する必要がある場所'http://na.com/DMP/DMP/programming/'
。subprocess
に渡す文字列を作成するときCreateProcess
、各パラメータはすでに引用符で囲まれています。したがって、自分で引用すると、パラメータを二重引用することになります。これが実際にWindowsで不可能な場合もあるので、ゴミになってしまいますが、ここではそうではないと思います。この引用符で囲まれた文字列をに正常に取得し、で始まる相対パスまたはプロトコルを含むURL 、またはそのようなものnet
を開きたいことを通知します。それが何であれ、それは使用可能なネットワークの場所ではなく、エラー67を引き起こす可能性があります。"http:
"http
ベンが指摘したように、あなたのsystem
呼び出しにも同様の問題があります。文字列全体を引用符で囲みます。あなたが本当にそれを理解したいのなら、おそらくこれがうまくいった理由があるでしょう…しかし私はあなたがそれを理解したいとは思わない。「間違ったことをしたが、運が良かった」と思って、将来はそうしないでください。
最後に、ドキュメントにあるように:
Windowsでは、argsシーケンスは解析可能な文字列に変換されます
つまり、Windowsで機能するコマンドラインがすでにある場合は、subprocess
再アセンブルするためにシーケンスに分割するよりも、文字列として使用する方がよいということです。
(これはWindowsにのみ当てはまることに注意してください!他のプラットフォームでは、ファミリ内の関数に渡すコマンドライン文字列を作成する代わりに、CreateProcess
ファミリ内の関数subprocess
に渡す文字列の配列を作成しますexec
。)
だから、これを行うだけです:
call("net use g: http://na.com/DMP/DMP/programming/")