Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 22.07.2017
Сообщений: 20

Скрипт копирующий сам себя

08.08.2017, 15:27. Показов 11000. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Мне нужно написать скрипт, который будет создавать копию файла из которого он запущен. Прямой пример - есть файл test.py, запустив который он создаст свою же копию. Но я не знаю как это сделать. Знаю что скорее всего понадобится модуль os чтобы работать с текущим файлом.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2017, 15:27
Ответы с готовыми решениями:

Как создать ZIP-архив, который распаковывается сам в себя много раз?
Как можно сделать на python ZIP-архив, который распаковывается сам в себя много раз? Спасибо.

Как сделать, чтобы скрипт удалил сам себя?
Доброго времени суток помогите разобраться: есть два пользователя, скрипт запускается su -c ./name.sh info &> /dev/null & ...

как сделать чтобы скрипт vbs сам себя добавлял в автозагрузку
люди помогите ПЛИИИИИИИИИИИИИИИЗ как сделать, чтобы скрипт vbs(ниже) при запуске сам себя добавлял в автозагрузку ...

6
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.08.2017, 16:21
Лучший ответ Сообщение было отмечено chelovekfromhel как решение

Решение

И чего тут сложного?
Скрипт тот же файл. Копировать файлы вы же умеете?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys
import os
 
destdir = os.path.abspath('destdir')
if not os.path.exists(destdir):
    os.makedirs(destdir)
 
# с использованием системного shell'а  
os.system('copy %s %s' % (__file__,destdir))
# другой вариант - с получением полного имени скрипта через sys.argv[0]
os.system('copy %s %s' % (sys.argv[0],destdir))
 
# без shell'а
dirname,filename = os.path.split(__file__)
content = open(__file__).read()
open(os.path.join(destdir,filename),'w').write(content)
P.S. И еще 100500 вариантов можно написать.

Добавлено через 20 минут
Python
1
2
3
4
from shutil import copyfile,copy
 
copy(__file__, destdir) # копируем в указанную директорию
copyfile(__file__, os.path.join(destdir,filename)) # копируем по полному пути нового расположения
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
09.08.2017, 11:45
Цитата Сообщение от Garry Galler Посмотреть сообщение
# без shell'а
dirname,filename = os.path.split(__file__)
content = open(__file__).read()
open(os.path.join(destdir,filename),'w') .write(content)
Файлы не закрыли.

А следующим будет вопрос, как скопировать exe, в котором и сидит питоновский скрипт. Вирусописатели совсем обленились.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
09.08.2017, 12:35
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Файлы не закрыли.
Дескриптор нигде не сохраняется.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
09.08.2017, 13:06
Хм, забавно, видимо сборщик мусора или ещё кто видит, что на дескриптор нет ссылок и закрывает файл.

Python
1
2
f = open(__file__)
input('>')
Bash
1
2
python 1.py &
[1] 3673
Bash
1
2
lsof -p 3673
python  3673  fox    3r   REG    8,1      120 1884161 /home/fox/1.py
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
09.08.2017, 13:23
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
или ещё кто видит
В вашем случае это сборщик мусора закрыл все после завершения скрипта.
В моем коде на дескрипторы вообще нет явных ссылок в коде - сборщику там делать нечего, система сама возвращает их в свой пул. Насколько быстро - отдельный вопрос. В любом случае если вы не создаете их 100500, то системного ограничения

ваш процесс вряд ли достигнет.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
09.08.2017, 14:17
Хотя, нет, тут я неправ насчет того, в моем коде GC делать нечего. На самом деле здесь он тоже срабатывает, причем как пишут, сразу же:
Когда ссылка на объект удаляется (при вызове Py_DECREF), Python всегда проверяет, не достиг ли счетчик ссылок на этот объект нуля. В этом случае будет вызван деаллокатор данного объекта...

C
1
2
3
4
5
6
7
8
#define Py_DECREF(op)                                   \
    do {                                                \
        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA       \
        --((PyObject*)(op))->ob_refcnt != 0)            \
            _Py_CHECK_REFCNT(op)                        \
        else                                            \
        _Py_Dealloc((PyObject *)(op));                  \
    } while (0)
Добавлено через 30 минут
----------------------------------------
Кстати, вот есть такой интересный способ проверить прямо из кода присутствуют ли в нем ссылки на файловые объекты:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import io,gc,os,sys
 
content = open(__file__).read()
open(os.path.join(destdir,filename),'w').write(content)
 
for f in [o for o in gc.get_objects() if isinstance(o, io.TextIOWrapper)]:
    print(f)
 
print('-' *20)
# явно записываем ссылку в переменную
fd = open(__file__)
content = fd.read())
 
for f in [o for o in gc.get_objects() if isinstance(o, io.TextIOWrapper)]:
    print(f)
Code
1
2
3
4
5
6
7
8
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='cp866'>
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp866'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp866'>
--------------------
<_io.TextIOWrapper name='D:\\INSTALL\\Python3\\PROJECTS\\create_copy_script.py' mode='r' encoding='cp1251'>
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='cp866'>
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp866'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp866'>
Как видим, в первом случае ничего кроме стандартных дескрипторов нет. А вот во втором, где ссылка на файл явно записана в переменную - есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.08.2017, 14:17
Помогаю со студенческими работами здесь

Троян, постоянно копирующий себя в оперативную память
Суть проблемы. Изначально мой антивирус(nod23) начал постоянно блокировать какой-то троян, постоянно копирующий себя в оперативную память и...

Автоматическая хранимая процедура Insert: сам создал - сам на себя ругается
Почему при автоматическом создании SP (хранимых процедур) с исп. insert, он генерирует их уже кривыми? Вот автоматически сгенерированная...

Копирование файла из директории, в которой находится сам копирующий батник
У меня такая проблема: Мне нужно чтобы мой батник копировал файл из текущей директории (Без указания пути типа: C:/test/file.exe) ...

Скрипт Powershell, копирующий файлы на Linux
Необходимо написать скрипт на powershell, который будет копировать файлы по протоколу SFTP на линукс сервер(Debian). Дайте предложения по...

Помогите написать скрипт, копирующий файлы в списке
Имеется список Files.txt Имеется путь /home/User/abc. Нужно чтобы скрипт читал построчно .txt, и сверял с содержимым директории abc. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru