【问题标题】:What is the proper way to transfer a file over a network with the shutil.copy module?使用 shutil.copy 模块通过网络传输文件的正确方法是什么?
【发布时间】:2018-03-15 21:25:57
【问题描述】:

我是一个新手程序员,所以请原谅我的代码很糟糕,而且我的查询很简单。我正在尝试通过 Python 将 SQL 数据库备份从一台机器传输到另一台机器。我在 Windows 7 Professional 机器上使用 Python 3.6.4 版。我将其转移到的机器是 Windows 10 机器。现在,当我在 Python shell 中逐行输入以下代码时,它可以正常工作。

import os, pyodbc, shutil
connection = pyodbc.connect(driver = '{ODBC Driver 13 for SQL Server}',
                        server = 'SERVER',
                        database = 'DATABASE',
                        UID = 'USER',
                        PWD = 'PASS',
                        autocommit = True)
connection.cursor().execute(
    r"backup database DATABASE to disk = 'c:/DB/backup/DATABASE.bak';")
connection.close()
os.system(r'net use   \\0.0.0.001\DB\backup /user:DOMAIN\USER PASS')
os.system(r'net use   \\0.0.0.100\d\Backups /user:DOMAIN\USER PASS')
file = 'DATABASE.bak'
src = os.path.join('\\\\0.0.0.001','DB','backup', file)
dst = os.path.join('\\\\0.0.0.100','d','Backups')
shutil.move(src, dst)
os.system(r'net use * /delete /y')

但是,当我编译代码(通过 pyinstaller)并在 Windows 10 机器上运行它时,它会在初始时间首先运行,然后每次都会出错。我得到的错误是Windows Error 2 (File Not Found)

Traceback (most recent call last):
  File "shutil.py", line 544, in move
FileNotFoundError: [WinError 2] The system cannot find the file specified: '\\\\0.0.0.001\\DB\\backup\\DATABASE.bak' -> '\\\\0.0.0.100\\d\\Backups\\DATABASE.bak'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "transfer.py", line 47, in SQL
  File "shutil.py", line 558, in move
  File "shutil.py", line 257, in copy2
  File "shutil.py", line 120, in copyfile
FileNotFoundError: [Errno 2] No such file or directory: '\\\\0.0.0.001\\DB\\backup\\DATABASE.bak'

我很困惑为什么会这样。任何指导都将不胜感激,这样我就可以停止在桌子上敲打我的头了。

【问题讨论】:

  • 您使用的是shutil.move。这不会复制文件,它会移动它。这意味着,成功后,源文件不再存在。因此,如果您再次尝试移动同一个文件,它将失败,因为您正在尝试移动一个不存在的文件。
  • 我在移动之前生成了一个新的数据库备份,所以该文件确实存在。
  • 这里的关键是:在移动之前。如果它在移动之前就在那里,是的,我们清楚地理解这一点。但是在移动之后就在那里吗?看起来不像!
  • 否,如果shutil.move 完成,则通过os.unlink 删除原始文件。当我再次运行脚本时,我首先生成备份,映射到共享源目录和共享目标目录,然后开始传输。在开始另一次传输之前手动删除旧备份。
  • 好吧,你说的似乎合乎逻辑,但你的代码没有这样做。该文件根本不存在。错误很明显。看来您将文件放在 c:/DB/backup/DATABASE.bak 中,但是(!)您正在寻找它似乎是 c:/xstoredb/backup/DATABASE.bak... 请从根本上重新考虑您在做什么。

标签: python pyinstaller shutil


【解决方案1】:

我能够通过使用os.system() 调用robocoby 然后使用os.remove() 删除原始文件来解决此问题。奇迹般有效。对不起shutil()

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2012-07-31
    • 1970-01-01
    • 2022-10-29
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多