LINUX.ORG.RU

Питон и как он вообще работает?

 


0

1

Написал простенький скриптик для обновления:

import urllib.request
import shutil
import os
import zipfile
import subprocess
from subprocess import Popen, PIPE
import os.path
import shlex
import time

if os.path.isfile('signalS'):
	os.remove('signalS')
	exit()
else:
	open('signalS', "w").close()

while True:
	if os.path.isfile('signalS'):
		f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())
		f1 = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/versad').read().decode('utf-8').strip())
		file = open('Interface/AddOns/NSQC/vers', 'r')
		file1 = open('Interface/AddOns/NSQC/versad', 'r')
		print(f,f1)
		if f != int(file.readline().strip()) or f1 != int(file1.readline().strip()):
			if os.path.isdir('temp'):
				shutil.rmtree('temp/')
			urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/main.zip", "main.zip")
			archive = 'main.zip'
			with zipfile.ZipFile(archive, 'r') as zip_file:
				zip_file.extractall("temp")
			file_source = 'temp/NSQC-main/'
			file_destination = 'Interface/AddOns/NSQC/'
			if not os.path.exists(file_destination):
				os.mkdir(file_destination)
			get_files = os.listdir(file_source)
			shutil.copytree(file_source, file_destination,dirs_exist_ok=True)
			if os.path.isfile('main.zip'):
				os.remove('main.zip')
			if os.path.isdir('temp'):
				shutil.rmtree('temp/')

		del f
		del f1
		time.sleep(10)
	else:
		break

На мой взгляд ну верно же все? Сравнивает версию с текущей, если отличается - обновляет. Логично? Но он этого не делает. Он один раз проверяет и дальше выдает версию, на которую обновил однажды. Почему? Ничего не понимаю.

Из интересного. Если изменить скрипт как угодно, например вписать или удалить принт - он тут же один раз сработает и штатно обновит все. Дальше продолжит работать вхолостую. Что за ересь?

Короче, сам нащупал рабочий вариант:

https://github.com/Vladgobelen/NSQCu/blob/main/run.py

Вместо роу, который кэшируется, я беру общую страницу:

f = urllib.request.urlopen(‘https://github.com/Vladgobelen/NSQC/blob/main/vers’).read().decode(‘utf-8’).strip()

И просто сравниваю ее с нужной мне строкой в файле. Если строка есть - все нормально, если строки нет, обновляем. Всем спасибо.

★★★★★

Последнее исправление: LightDiver (всего исправлений: 1)

ЯННП, но вообще то в питоне есть компиляция в байткод .py–>.pyc

ЕМНИП если есть акутальный .pyc то запускается именно он, если .py был обновлен то .pyc обновляется автоматически.

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Нет, не ло гично. Дальше я меняю файл, заливаю на гит и долго долго жду. Ждать можно бесконечно - оно будет выдавать старые данные и нихрена не обновит. Хотя по логике должен.

В теории я поставил таймер 10 секунд, затем обнуляю переменные. Цикл начинается заново - должен быть проверка. Так? А ее нету. Он не получает новые данные почему то.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Что за ересь происходит вообще в питоне?

if f != int(file.readline().strip()) or f1 != int(file1.readline().strip()):

Так работает.

print(file.readline().strip(),file1.readline().strip())
if f != int(file.readline().strip()) or f1 != int(file1.readline().strip()):

А так - нет:

if f != int(file.readline().strip()) or f1 != int(file1.readline().strip()):
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: ''
LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от frunobulax

А я не могу вывести содержимое файла. Как только я вставляю принт, перестает работать условие. Но менять его могу только я вручную.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

А. Ну так он у тебя в условии уже следующую строку файла читает (или пытается прочитать).

Пихни чтоль файл полностью в переменную, с конструкцией with open и оттуда уже распарсь нужное значение. Туго соображаю сейчас, но навскидку так будет более получше.

frunobulax ★★
()
Ответ на: комментарий от frunobulax

Короче:

f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())
f1 = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/versad').read().decode('utf-8').strip())
file = open('Interface/AddOns/NSQC/vers', 'r')
file1 = open('Interface/AddOns/NSQC/versad', 'r')
ff = int(file.readline().strip())
ff1 = int(file1.readline().strip())
print(f,f1,ff,ff1)

Вот так он печатает. Вот лог:

280 9 280 9
280 9 280 9
280 9 280 9
280 9 280 9
280 9 280 9
280 9 280 9

Меняю число на 283, например. Заливаю на гит. Лог продолжает крутить, что там 280. В файле 280. На гите 283.

Пока это писал само обновило таки:

280 9 280 9
280 9 280 9
280 9 280 9
283 9 280 9
283 9 283 9

Там вон выше писали про хэдеры и кэш. Видимо это оно, но я не понимаю как их прописать.

Я потестировал. Оно обновляется ровно 2 минуты.. А хотелось бы по запросу.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

А так - нет

Ну наверное в файле одна строка. И ты её прочитал строкой выше. Далее схватил EOF, потому и '' в int() передаётся.

И попробуй закрывать таки файлы после чтения.

А то жесть какая-то, хрен поймёшь как написано — вот и хрен поймёшь, что происходит.

Хотя бы как-то так что ли:

while True:
    if not os.path.isfile('signalS'):
        continue
    f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())
    f1 = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/versad').read().decode('utf-8').strip())
    with open('Interface/AddOns/NSQC/vers', 'r') as fd:
        ff = fd.readline().strip()
    with open('Interface/AddOns/NSQC/versad', 'r') as fd:
        ff1 = fd.readline().strip()
    print(f, f1, ff, ff1)
    if f == int(ff) and f1 == int(ff1):
        time.sleep(10)
        continue
    if os.path.isdir('temp'):
        shutil.rmtree('temp/')
    urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/main.zip", "main.zip")
    archive = 'main.zip'
    with zipfile.ZipFile(archive, 'r') as zip_file:
        zip_file.extractall("temp")
    file_source = 'temp/NSQC-main/'
    file_destination = 'Interface/AddOns/NSQC/'
    if not os.path.exists(file_destination):
        os.mkdir(file_destination)
    get_files = os.listdir(file_source)
    shutil.copytree(file_source, file_destination,dirs_exist_ok=True)
    if os.path.isfile('main.zip'):
        os.remove('main.zip')
    if os.path.isdir('temp'):
        shutil.rmtree('temp/')

    time.sleep(10)
CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Про хидеры пример в доках:

req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
# Customize the default User-Agent header value:
req.add_header('User-Agent', 'urllib-example/0.1 (Contact: . . .)')
r = urllib2.urlopen(req)

Я нуб конечно, но мне вот эта часть не нравится:

f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())

Имхо, лучше получить запрос отдельным объектом. Заодно сможешь поиграться с заголовками и прочим.

frunobulax ★★
()
Последнее исправление: frunobulax (всего исправлений: 1)
Ответ на: комментарий от CrX
    ff = open('Interface/AddOns/NSQC/vers', 'r').readline().strip()
    ff1 = open('Interface/AddOns/NSQC/versad', 'r').readline().strip()

а если убрать отладочный вывод то можно избавиться ещё и от f,f1,ff,ff1 и сразу сравнивать int-ы в if-е

firkax ★★★★★
()
Ответ на: комментарий от firkax

Ну, если у меня в линуксе оно хотя бы раз в 2 минуты обновляет, у пользователей на винде вообще отказалось работать. В плане обновления:

import urllib.request
import shutil
import os
import zipfile
import subprocess
from subprocess import Popen, PIPE
import os.path
import shlex
import time

if os.path.isfile('signalS'):
	os.remove('signalS')
	exit()
else:
	open('signalS', "w").close()

subprocess.run("Wow.exe")
while True:
	if os.path.isfile('signalS'):

		def process_exists(process_name):
			progs = str(subprocess.check_output('tasklist'))
			if process_name in progs:
				return True
			else:
				return False

		if process_exists('Wow.exe'):
			f = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/vers').read().decode('utf-8').strip())
			f1 = int(urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/versad').read().decode('utf-8').strip())
			file = open('Interface/AddOns/NSQC/vers', 'r')
			file1 = open('Interface/AddOns/NSQC/versad', 'r')
			ff = int(file.readline().strip())
			ff1 = int(file1.readline().strip())
			if int(f) != ff or int(f1) != ff1:
				if os.path.isdir('temp'):
					shutil.rmtree('temp/')
				urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/main.zip", "main.zip")
				archive = 'main.zip'
				with zipfile.ZipFile(archive, 'r') as zip_file:
					zip_file.extractall("temp")
				file_source = 'temp/NSQC-main/'
				file_destination = 'Interface/AddOns/NSQC/'
				if not os.path.exists(file_destination):
					os.mkdir(file_destination)
				get_files = os.listdir(file_source)
				shutil.copytree(file_source, file_destination,dirs_exist_ok=True)
				if os.path.isfile('main.zip'):
					os.remove('main.zip')
				if os.path.isdir('temp'):
					shutil.rmtree('temp/')
			file.close()
			file1.close()
			del f
			del f1
			time.sleep(120)
		else:
			break
	else:
		break

Казалось бы - все верно, но.. Ладно, завтра буду копать дальше.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Вот говна напишут и ругаются потом. ф-ию запихал *** пойми куда. эт я про process_exists

все пути относительные

файлы читаешь без контекстного менеджера.

про кодстайл вообще лучше промолчать.

Повторюсь, что ты хочешь если ты сам написал говна, и ругаешься что оно не работает?

ggrn ★★★★★
()
Последнее исправление: ggrn (всего исправлений: 1)
Ответ на: комментарий от ggrn

Эта функция наверное единстенное, что работает идеально и каждый раз. Чему там не работать? Читает процесс по имени и если есть, так и говорит. Не работает чтение файла с гита.

Я не думаю, что интерпретатору так важна красота кода. Хуже что он тупо не выполняет то, что написано.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от vvn_black

Вот реально, я вообще не понимаю этих упоротых.

Им сам царь гвидон даже накатал PEP, о том что ну не надо использовать табы, нехер использовать табы, не используйте табы. Но нет, находятся упорки.

https://peps.python.org/pep-0008/#tabs-or-spaces

Потом их код косоебит, на всяких гитхабах кривые отступы и так далее.

Это несмотря на то что даже самый распоследний всратый редактор поддерживает вставку пробелов по нажатию табов, а то и вообще автоиндент.

lovesan ★★
()
Ответ на: комментарий от lovesan

я вообще не понимаю этих упоротых

И видят, что ЛОР, как пример, рисует таб в 8 знаков (из-за чего код выглядит хуже чем он есть на самом деле), и всё равно ведь это не аргумент.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от lovesan

царь гвидон даже накатал PEP

Он сначала наложил себе с умным видом в штаны, а потом начал всякие оправдания придумывать. Любой адекватный человек просто признал бы что спорол херню и запилил скобочки хотя бы выкинул табы вообще.

no-such-file ★★★★★
()
Ответ на: комментарий от lovesan

Им сам царь гвидон даже накатал PEP

лично я этот PEP не читал, а о 4 пробелах где-то то ли на форуме, то ли в статье в инете видел. Что-то мне подсказывает, что не будет среднестатистический питонист читать какие-то PEP’ы.

seiken ★★★★★
()

в чём то проблема?

import urllib.request,os,zipfile,os.path,time
def fufu():
    dif=lambda v:open('Interface/AddOns/NSQC/'+v, 'r').readline().strip()!=\
        urllib.request.urlopen('https://raw.githubusercontent.com/Vladgobelen/NSQC/main/'+v).read().decode('utf-8').strip()
    if dif('vers')or dif('versad'):
        z='main.zip'
        urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/"+z, z)
        if os.path.isfile(z):
            with zipfile.ZipFile(archive :=z, 'r') as zip_file:
                os.makedirs(file_destination :='Interface/AddOns/NSQC/' )
                zip_file.extract('NSQC-main',file_destination)
            os.remove(z)
if os.path.isfile('signalS'):os.remove('signalS');exit()
open('signalS', "w").close()
while os.path.isfile('signalS'):
    fufu()
    time.sleep(10)

и в чём собственно проблема то?

qulinxao3
()
Ответ на: комментарий от qulinxao3

Проблема в том, что питон я вижу в 5 раз, а программировать по сути начал 4 месяца назад и то на луа. Я пока смутно понимаю что в этом коде, но процентов на 80. Спасибо. не знал что импорт можно через запятую. И про последние три строки тоже спасибо, запомню.

Однако мне код нужно менять и дополнять, поэтому я лучше напишу сам, чтобы понимать точно то происходит.

А конкретно у меня в коде проблема в том, что не читается файл с гитхаба.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

ну возми туже vscode

и пошагово отдебужся - увидишь где твои представления не реальны

имхо нет теобходимости конвертить в int версии достаточно убрать концевые переводы строк либо просто читать в обоих случаях одинаково

кста а не может ли быть что когда повторно распаковываешь то оно не затирает уже имеющиеся файлы - от того и эффект однократного сохранения

имхо последнее вероятней всего - просто удаляй старую версию если версии не совпадают

чисто проверь

qulinxao3
()
Ответ на: комментарий от qulinxao3

Похоже ошибок у меня нету. Это кэш гитхаба. Оно и ерез браузер в роу не обновляется несколько минут. Значит проблема нерешаема в текущем виде.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от qulinxao3

Неприятно, но некритично, если это вообще будет работать у пользователей. Пока ни одного достоверного случая нет. Попробую найти еще тестеров.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

всё таки под отладчиком пройди

либо в code (pycharm если не брезгуешь)

либо по хардкору import pdb и вперёд breakpoint

либо

python -m pdb твой_код

https://realpython.com/courses/python-debugging-pdb/

т.е в обычном python REPL пошаговый отладчик - сможешь увидить всё таки чё к чему

update: https://habr.com/ru/articles/104086/

qulinxao3
()
Последнее исправление: qulinxao3 (всего исправлений: 2)
Ответ на: комментарий от qulinxao3

Я тут сделал гениальнейшую штуку.. И она даже в линуксе работает, но…

import urllib.request
import shutil
import os
import zipfile
import subprocess
from subprocess import Popen, PIPE
import os.path
import shlex
import time
print('1')
def process_exists(process_name):
	print('2')
	progs = str(subprocess.check_output('tasklist'))
	if process_name in progs:
		return True
	else:
		return False

print(process_exists('Wow.exe'))
print('3')
def update():
	print(process_exists('Wow.exe'))
	print('4')
	f = urllib.request.urlopen('https://github.com/Vladgobelen/NSQC/blob/main/vers').read().decode('utf-8').strip()
	file = open('Interface/AddOns/NSQC/vers', 'r')
	print(process_exists('Wow.exe'))
	print('5')
	if not file.readline().strip() in f:
		print(process_exists('Wow.exe'))
		print('6')
		if os.path.isdir('temp'):
			shutil.rmtree('temp/')
		urllib.request.urlretrieve("https://github.com/Vladgobelen/NSQC/archive/refs/heads/main.zip", "main.zip")
		archive = 'main.zip'
		with zipfile.ZipFile(archive, 'r') as zip_file:
			zip_file.extractall("temp")
		file_source = 'temp/NSQC-main/'
		print(file_source)
		file_destination = 'Interface/AddOns/NSQC/'
		if not os.path.exists(file_destination):
			os.mkdir(file_destination)
		get_files = os.listdir(file_source)
		shutil.copytree(file_source, file_destination,dirs_exist_ok=True)
		if os.path.isfile('main.zip'):
			os.remove('main.zip')
		if os.path.isdir('temp'):
			shutil.rmtree('temp/')
	file.close()
	del f

print(process_exists('Wow.exe'))
print('7')
update()

if not process_exists('Wow.exe'):
	subprocess.run("Wow.exe")
print('8')
while True:
	print('9')
	#if process_exists('Wow.exe'):
	update()
	print('11')
	time.sleep(10)
	print(process_exists('Wow.exe'))
	print('12')
	#else:
	#	break

Оно доходит до вот этого участка:

print(process_exists('Wow.exe'))
print('7')
update()

if not process_exists('Wow.exe'):
	subprocess.run("Wow.exe")
print('8')

И восьмерка никогда уже не печатается. То есть оно открывает игру и на этом цикл замирает, пока игра не закроется.

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Может, тебе стоит попробовать subprocess.Popen вместо subprocess.run?

del f

Убери, у тебя функция и так заканчивается, смысла в этой строке ровно 0.
Upd.: совет отменяется, пиши, как можешь; хорошо всё равно не получится, лишь бы работало.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 2)
Ответ на: комментарий от Virtuos86

Все уже, нашел решние. Описал в основном сообщении.

Просто я думал, может сохраняется ее содержимое. Пытался обнулить. Я уже попадался на такое с глобальными переменными.

LightDiver ★★★★★
() автор топика