【问题标题】:Error while trying to rename a directory through cmd command from python尝试通过 python 中的 cmd 命令重命名目录时出错
【发布时间】:2013-03-24 23:18:09
【问题描述】:

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

你能帮忙吗?

【问题讨论】:

  • 你为什么要脱壳而不是简单地使用os.rename

标签: python cmd tkinter


【解决方案1】:

你应该使用这个:

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 用于使用内置的 os.rename() 而不是 hacky 调用命令提示符。
  • 感谢您的回答。一个问题,打印我得到的 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,会试试的,谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

  • +1。可以使用更宽松的shutil.move() 代替os.rename()
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 2023-03-18
  • 1970-01-01
  • 2020-12-26
  • 2011-07-12
  • 2021-11-01
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多