2016-10-27 21 views
0

私のコマンドは、いずれかのpythonの方法のいずれかを介してWindowsのcmdで実行する。 'ネット利用のJ:\ D \ sharedfolderは私のPCを\' どのように私は、Pythonでこの上記のコマンドを実行することができますcmdが実行されますが、python os.popenとsubprocess.call、subprocess.popenとos.systemは実行されません。なぜですか?

>>> print os.popen('net use').read() 
New connections will be remembered. 


Status  Local  Remote     Network 

------------------------------------------------------------------------------- 
OK   M:  \\Purushoth-pc\d\marriagePhotosCh 
               Microsoft Windows Network 
OK   N:  \\Purushoth-pc\d\Materials 
               Microsoft Windows Network 
The command completed successfully. 


>>> print os.popen('net use J: \\Purushoth-pc\d\Materials').read() 

>>> subprocess.Popen('net use J: \\Purushoth-pc\d\Materials', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 
('', 'System error 67 has occurred.\r\n\r\nThe network name cannot be found.\r\n\r\n') 
>>> os.system('net use J: \\Purushoth-pc\d\Materials') 
2 
>>> subprocess.call('net use J: \\Purushoth-pc\d\Materials /persistent:yes', shell=True) 
2 
>>> subprocess.check_call('net use J: \\Purushoth-pc\d\Materials /persistent:yes', shell=True) 

Traceback (most recent call last): 
    File "<pyshell#35>", line 1, in <module> 
    subprocess.check_call('net use J: \\Purushoth-pc\d\Materials /persistent:yes', shell=True) 
    File "C:\Python27\lib\subprocess.py", line 541, in check_call 
    raise CalledProcessError(retcode, cmd) 
CalledProcessError: Command 'net use J: \Purushoth-pc\d\Materials /persistent:yes' returned non-zero exit status 2 

を? 条件:任意のサードパーティ製のモジュールを使用しない - 彼らはPythonの文字列リテラルで特別な意味を持っているバックスラッシュを、含まれているため必須

この問題を整理するために私を助けてください、事前に感謝

+1

コマンドTWICEを実行しました。最初の人は 'N:'ネットワークドライブを作成して作成しました。 'N:'が既に存在するので、第2のFAILS。 –

+0

'N:'がまだ存在していないことを確認しましたか?それは既に存在する場合、コマンドがコード2で終了するように思えます。これは、最初の呼び出しが2を返したためです.2番目の呼び出しは例外を投げました(0以外の場合は例外です)。 3番目の呼び出しでエラーが表示されます。また、['os.popen'](https://docs.python.org/2/library/os.html#os.popen)は推奨されていません。 – xZise

+0

@MarcB最初の呼び出しが成功したとは思わない。 ['subprocess.call()'](https://docs.python.org/2/library/subprocess.html#subprocess.call)は終了コードのみを実行し、0でなければ例外を発生させません。 – xZise

答えて

0

あなたのコマンドが失敗しています。特に、ネットワークパスの先頭にある「\\」が単一の「\」に変わり、ネットワークパスにならなくなります(この置換は、貼り付けられたテキストの最後の行のエラーメッセージに表示されます) 。

エスケープするためにバックスラッシュを二重にするか(このような場合はすぐに判読できない)、文字列リテラルの前に "r"を置くことで、特に "raw"文字列にすることができますバックスラッシュを解釈する。例:os.popen(r'net use J: \\Purushoth-pc\d\Materials').read()

+0

ありがとう、あなたの提案は正しいです。 –

関連する問題