试图通过python中的cmd命令重命名目录时出错

试图通过python中的cmd命令重命名目录时出错,python,cmd,tkinter,Python,Cmd,Tkinter,我有一段python/tkinter代码,它试图重命名一个目录。在执行call()时,它会抛出一个错误 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.destD

我有一段python/tkinter代码,它试图重命名一个目录。在执行call()时,它会抛出一个错误

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)
你能帮忙吗

您应该使用以下选项:

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 )
您应该使用以下选项:

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 )
Windows上没有“重命名”程序

相反,“重命名”是命令提示符程序(
cmd.exe
)中的内置命令。因此,当您在命令提示符下键入“rename”时,
cmd.exe会对其进行特殊处理

当您使用Python的
子进程
模块运行程序时(默认情况下),它不使用
cmd.exe
,而是尝试运行实际的程序。这不适用于
重命名
。您可以通过将
shell=True
选项传递到
subprocess.call
来更改此设置;如果你这样做,那么它应该会起作用。(如果您从Internet获取命令行的任何部分或其他您不信任的内容,这也会引入安全漏洞,这就是为什么它不是默认设置的原因)

但是使用
os.rename()
是一个更好的解决方案-您可以获得更好的错误处理,您的程序将更快、更可靠、更安全、更简单、更易于其他程序员理解,并且可移植到Linux/Mac。(一个“更可靠”的例子:如果目录名包含空格,当前代码将中断;但是
os.rename()
将正常工作)。

Windows上没有“重命名”程序

相反,“重命名”是命令提示符程序(
cmd.exe
)中的内置命令。因此,当您在命令提示符下键入“rename”时,
cmd.exe会对其进行特殊处理

当您使用Python的
子进程
模块运行程序时(默认情况下),它不使用
cmd.exe
,而是尝试运行实际的程序。这不适用于
重命名
。您可以通过将
shell=True
选项传递到
subprocess.call
来更改此设置;如果你这样做,那么它应该会起作用。(如果您从Internet获取命令行的任何部分或其他您不信任的内容,这也会引入安全漏洞,这就是为什么它不是默认设置的原因)


但是使用
os.rename()
是一个更好的解决方案-您可以获得更好的错误处理,您的程序将更快、更可靠、更安全、更简单、更易于其他程序员理解,并且可移植到Linux/Mac。(一个“更可靠”的示例:如果目录名包含空格,则当前代码将中断;但是
os.rename()
将正常工作)。

为什么您要使用shell而不是简单地使用
os.rename
?为什么您要使用shell而不是简单地使用
os.rename
?+1来使用内置os.rename()而不是在命令提示符下大声呼叫。谢谢你的回答。一个问题,打印os.rename的参数:C:\Users\lenovo\Desktop\old old_2013_03_27_07_21,但在运行上述调用时,我在桌面上没有看到任何old或old_2013_03_27_07_21。现有的旧系统消失了。你能告诉我为什么会这样吗?
os.rename
可以移动目录,也可以重命名它们
old_2013_03_27_07_21
是一个相对路径,它位于脚本运行的任何目录中。如果要将目录重命名为
C:\Users\lenovo\Desktop\old_2013_03_27_07_21
,只需将其作为第二个要重命名的参数传递。使用此参数,shell=True:self.cmd1=('rename{0}{1})。format(self.destDirectory,'wsprto'+self.now))self.returnCode1=call(self.cmd1,shell=True)按预期工作。但是os.rename()没有。@user9876将尝试使用它,谢谢。+1使用内置的os.rename()而不是对命令提示符的恶意调用。谢谢你的回答。一个问题,打印os.rename的参数:C:\Users\lenovo\Desktop\old old_2013_03_27_07_21,但在运行上述调用时,我在桌面上没有看到任何old或old_2013_03_27_07_21。现有的旧系统消失了。你能告诉我为什么会这样吗?
os.rename
可以移动目录,也可以重命名它们
old_2013_03_27_07_21
是一个相对路径,它位于脚本运行的任何目录中。如果要将目录重命名为
C:\Users\lenovo\Desktop\old_2013_03_27_07_21
,只需将其作为第二个要重命名的参数传递。使用此参数,shell=True:self.cmd1=('rename{0}{1})。format(self.destDirectory,'wsprto'+self.now))self.returnCode1=call(self.cmd1,shell=True)按预期工作。但是os.rename()没有。@user9876会试试的,谢谢。+1。可以使用更宽松的
shutil.move()
代替
os.rename()
+1。可以使用更宽松的
shutil.move()
代替
os.rename()