1

ここで初めて質問する:

Windowsでネットワークドライブをマッピングする必要があります。場所は内部SharePointドキュメントライブラリです。

コマンドウィンドウで:

net use g: http://na.com/DMP/DMP/programming/

成功しました->コマンドは正常に完了しました

os.system('"net use k: http://na.com/DMP/DMP/programming/"')

も成功しています。

ただし、ドライブがすでにマップされている場合は、subprocess.callを使用したいのですが、別のドライブを試してみたいと思います。

call(["net", "use", ":q", '"http://na.com/DMP/DMP/programming/"'])

これは「システムエラー67が発生しました。ネットワーク名が見つかりません」で失敗します。最後のリスト項目に対して多くのオプションを試しましたが、うまくいきませんでした。

これを正常に完了するためにそこに何を詰め込むことができるか、またはドライブをマップするための別の方法。

4

1 に答える 1

3

コードには少なくとも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/")
于 2013-02-01T22:12:38.810 に答える