Как объясняется в проблеме Github , которую вы связали, NPY_OWNDATA
безопасно использовать только с памятью, выделенной через тот же распределитель, который использует сама NumPy. К этому распределителю можно получить доступ через функции PyDataMem_*
. Если ваша память не исходит от этого распределителя, вы не можете использовать NPY_OWNDATA
.
Не пытайтесь заставить массив принять владение произвольной памятью, которую вы ему даете. Вместо этого установите base массива для объекта, который знает, как выполнить правильную очистку, используя PyArray_SetBaseObject
. Капсула может быть удобным объектом для использования.
Вы не упоминаете, должен ли это быть пакет только, но если можно использовать ROBOCOPY
, попробуйте это:
ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
РЕДАКТИРОВАНИЕ: Измененный /S
параметр к /E
для включения пустых папок.
XCOPY /S folder1\data.zip copy_of_folder1
XCOPY /S folder1\info.txt copy_of_folder1
РЕДАКТИРОВАНИЕ: , Если Вы хотите сохранить пустые папки (которому при перечитывании Вашего сообщения Вы кажетесь) используют/E вместо/S.
Подобный решению Paulius, но файлам Вы не заботитесь о, не копируются тогда удаленные:
@echo OFF
:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp
:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I
Это - только две простых команды, но я не рекомендовал бы это, если файлы, которые Вы не должны копировать, не являются маленькими. Поэтому это скопирует ВСЕ файлы и затем удалит файлы, которые не нужны в копии.
xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"
Несомненно, вторая команда довольно долга, но она работает!
кроме того, этот подход не требует, чтобы Вы загрузили и установили любые сторонние инструменты (Windows 2000 +, ПАКЕТ имеет достаточно команд для этого).
Альтернативное решение, которое копирует один файл за раз и не требует ROBOCOPY:
@echo off
setlocal enabledelayedexpansion
set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
Внешний оператор for генерирует любую возможную комбинацию путей подкаталога в SOURCE_DIR
и имени в FILENAMES_TO_COPY
. Для каждого существующего файла вызывается xcopy. FILE_INTERMEDIATE_DIR
содержит путь к подкаталогу файла в SOURCE_DIR
, который необходимо создать в DEST_DIR
.