尝试通过cmd命令从python重命名目录时出错

问题描述:

我有这段尝试重命名目录的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

你应该使用这样的:

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

有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