4

shutil モジュール、特に shutil.copyfile の代替が必要です。

shutil モジュール全体を役に立たなくする py2exe のあまり知られていないバグです。

4

3 に答える 3

3

うーん

os.system("cp file1 file2") ?

なぜshutilがpy2exeで機能しないのかわかりません...おそらくpy2exeにそのライブラリを含めるように明示的に指示する必要があります...

于 2012-10-24T04:14:43.737 に答える
2

os.system() を使用すると、多くの理由で問題が発生します。たとえば、ファイル名にスペースや Unicode が含まれている場合です。また、例外/失敗に比べてより不透明になります。

これが Windows 上にある場合、 win32file.CopyFile() を使用するのがおそらく最良の方法です。これにより、元のファイルに関連する正しいファイル属性、日付、アクセス許可などが得られるためです (つまり、結果により似たものになります)。エクスプローラーを使用してファイルをコピーすることで取得できます)。

于 2013-05-15T17:08:04.997 に答える
1

への単純な呼び出しが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)
于 2012-10-24T05:03:51.837 に答える