2013-03-24 84 views
0

我有這段嘗試重命名目錄的python/tkinter代碼。當call()被執行時,它會導致一個錯誤。嘗試通過cmd命令從python重命名目錄時出錯

if os.path.exists(self.destDirectory): 
    self.now = datetime.datetime.now() 
    print(self.now) 
    self.now = str(self.now.strftime("%Y_%m_%d_%H_%M")) 
    print('rename {0} {1}'.format(self.destDirectory, 'old_' + self.now)) 
    self.cmd1 = ('rename {0} {1}'.format(self.destDirectory, 'old_' + self.now)) 
    self.returnCode1 = call(self.cmd1) 

錯誤:

Exception in Tkinter callback Traceback (most recent call last): 
File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__ 
    return self.func(*args) 
File "C:\EclipseWorkspaces\csse120\Myproject\src\BoxRestore.py", line 95, in proceed 
    self.returnCode1 = call(self.cmd1) 
File "C:\Python32\lib\subprocess.py", line 467, in call 
    return Popen(*popenargs, **kwargs).wait() 
File "C:\Python32\lib\subprocess.py", line 741, in __init__ 
    restore_signals, start_new_session) 
File "C:\Python32\lib\subprocess.py", line 960, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

但是當我做:

print('rename {0} {1}'.format(self.destDirectory, 'old_' + self.now)) 

而且在cmd中執行它我沒有得到任何錯誤。

另一個命令不會抱怨:

self.cmd2 = ('xcopy {0} {1} /I /E'.format(self.values['sourceButton'], self.values['destinationButton'])) 
self.returnCode = call(self.cmd2) 

你能幫。

+4

你爲什麼要掏出而不是簡單地使用'os.rename'? – 2013-03-24 23:26:58

回答

2

你應該使用這樣的:

if os.path.exists(self.destDirectory): 
    self.now = datetime.datetime.now() 
    print(self.now) 
    self.now = str(self.now.strftime("%Y_%m_%d_%H_%M")) 
    print('rename {0} {1}'.format(self.destDirectory, 'old_' + self.now)) 
    os.rename(self.destDirectory, 'old_' + self.now) 
+1

+1使用內置的os.rename()而不是hacky調用命令提示符。 – user9876 2013-03-25 01:24:55

+0

感謝您的回答。一個問題,我打印os.rename的參數:C:\ Users \ lenovo \ Desktop \ old old_2013_03_27_07_21 但是在運行上述調用時,我的桌面上看不到任何old或old_2013_03_27_07_21。現有的舊消失。 你能告訴我爲什麼它可能會發生? – 2013-03-27 02:00:49

+1

'os.rename'可以移動目錄以及重命名它們。 'old_2013_03_27_07_21'是一個相對路徑 - 它位於腳本運行的任何目錄中。如果要將目錄重命名爲'C:\ Users \ lenovo \ Desktop \ old_2013_03_27_07_21',只需將其作爲第二個參數進行重命名即可。 – user9876 2013-03-27 02:13:41

2

有Windows上的 「重命名」 計劃。

而是,「rename」是命令提示程序中的內置命令(cmd.exe)。因此,當您在命令提示符下鍵入「重命名」時,它會被cmd.exe專門處理。

當您使用Python的subprocess模塊運行程序時,(默認情況下)它不使用cmd.exe,它會嘗試運行實際的程序。這對rename不起作用。您可以通過將shell=True選項傳遞給subprocess.call來更改此設置;如果你這樣做,那麼它應該工作。 (如果您從Internet獲取命令行的任何部分或其他您不能信任的東西,這也會引入安全漏洞,這就是爲什麼它不是默認值)。

但使用os.rename()MUCH更好的解決方案 - 你得到更好的錯誤處理,你的程序將更快,更可靠,更安全,更簡單,更容易爲其他程序員理解,並移植到Linux的/ Mac的。 (「更可靠」的一個例子:如果目錄名稱包含空格,則當前代碼會中斷;但os.rename()將正常工作)。

+0

+1。可以使用更寬鬆的'shutil.move()'來代替'os.rename()' – jfs 2013-03-25 02:04:58

+0

+1。 「重命名」屬於cmd。可執行程序 – 2013-03-27 02:03:37