0

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

你能帮忙吗?

4

2 回答 2

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 )
于 2013-03-25T00:48:47.803 回答
2

Windows 上没有“重命名”程序。

cmd.exe相反,“重命名”是命令提示程序 ( )中的内置命令。因此,当您在命令提示符下键入“重命名”时,它会被cmd.exe.

当您使用 Python 的subprocess模块运行程序时,(默认情况下)它不使用cmd.exe,它会尝试运行实际程序。这对rename. 您可以通过将shell=True选项传递给subprocess.call; 如果你这样做,那么它应该工作。(如果您从 Internet 或其他您不信任的地方获取命令行的任何部分,这也会引入一个安全漏洞,这就是它不是默认设置的原因)。

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

于 2013-03-25T01:33:44.387 回答