shutil モジュール、特に shutil.copyfile の代替が必要です。
shutil モジュール全体を役に立たなくする py2exe のあまり知られていないバグです。
うーん
os.system("cp file1 file2") ?
なぜshutilがpy2exeで機能しないのかわかりません...おそらくpy2exeにそのライブラリを含めるように明示的に指示する必要があります...
os.system() を使用すると、多くの理由で問題が発生します。たとえば、ファイル名にスペースや Unicode が含まれている場合です。また、例外/失敗に比べてより不透明になります。
これが Windows 上にある場合、 win32file.CopyFile() を使用するのがおそらく最良の方法です。これにより、元のファイルに関連する正しいファイル属性、日付、アクセス許可などが得られるためです (つまり、結果により似たものになります)。エクスプローラーを使用してファイルをコピーすることで取得できます)。
への単純な呼び出しがos.system()
機能する場合は、そのソリューションを使用してください。たった1行のコードです!
本当に shutil.copyfile のようなものが必要な場合は、Python ソースから必要なものを取得できます。Python-2.7.3/Lib/shutil.py からの関連コードは次のとおりです。
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
def _samefile(src, dst):
# Macintosh, Unix.
if hasattr(os.path, 'samefile'):
try:
return os.path.samefile(src, dst)
except OSError:
return False
# All other platforms: check for same pathname.
return (os.path.normcase(os.path.abspath(src)) ==
os.path.normcase(os.path.abspath(dst)))
def copyfile(src, dst):
"""Copy data from src to dst"""
if _samefile(src, dst):
raise Error("`%s` and `%s` are the same file" % (src, dst))
for fn in [src, dst]:
try:
st = os.stat(fn)
except OSError:
# File most likely does not exist
pass
else:
# XXX What about other special files? (sockets, devices...)
if stat.S_ISFIFO(st.st_mode):
raise SpecialFileError("`%s` is a named pipe" % fn)
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fds
すべてのエラー チェックを無視してもかまわない場合は、次のように要約できます。
def copyfile(src, dst):
length = 16 * 1024
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
while True:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)