2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 15:34 


27/09/19
189
Помогите, пожалуйста, разобраться.
Код будет чуть ниже, а дальше я объясню для чего и что именно я хочу сделать.
Используется синтаксис Python
import os, pyperclip, subprocess

x = pyperclip.paste()    

print('Как назвать файл?')

y = input()

with open(r"'C:\Users\1234\OneDriveабочий стол\'"+'y'+r".py",'w') as tw:
     n=input()
     tw.write(r"import os, pyperclip, subprocess")
     tw.write(r"r'pyperclip.copy(r'"+x+"')")

Программа предлагает ввести $y$ и завершается на этом. $n$ ввести не предлагает
Идея в том, что я хотел бы создать программу, которая бы запоминала то, что сейчас в буфере обмена и создавала файл на рабочем столе, который по клику копирует ту информацию, которая была в буфере обмена на момент создания файла.
То есть программа должна создавать файлы такого типа и называть их как-то.

Используется синтаксис Python
import os, pyperclip, subprocess

pyperclip.copy(r'Полезная информация из буфера обмена')
 

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 16:27 
Заслуженный участник


16/02/13
4105
Владивосток
А файл создаёт?
А вы уверены, что два раза ентер не нажали?

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 16:53 


09/05/16
138
Распечатайте значение строки r"'C:\Users\1234\OneDrive\Рабочий стол\'"+'y'+r".py". Что с ним не так? Скорее всего, дело в лишней кавычке, которая мешает интерпретировать её как полный путь с буквой диска.

Чтобы ловить такие ошибки самостоятельно, используйте отладчик и смотрите, с каким исключением падает программа.

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 16:56 
Экс-модератор
Аватара пользователя


23/12/05
12046
Для начала: не используйте слэши \ в пути 'C:\Users\1234\OneDrive\Рабочий стол\'
Комбинации \0, \a, \b, \t, \n, \v, \f, \r и, возможно, какие-то еще работают как управляющие символы. Либо \\ либо / вместо них.

Во-вторых, я вижу у вас там +'y'+. Вы уверены, что подставится введенное имя файла?
В-третьих, я бы рекомендовал собрать путь в кучу до того, как открывать файл - так будет проще его рассмотреть/проверить,
Используется синтаксис Python
folder = 'C:/Users/1234/OneDrive/Рабочий стол'
file_name = f'{y}.py'
path = os.join(folder, filename)
with open(path ,'w') as tw:

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:18 


27/09/19
189
iifat в сообщении #1559422 писал(а):
А файл создаёт?
А вы уверены, что два раза ентер не нажали?

Не создает, к сожалению. Уверен, что правильно запустил. Также запускал через командную строку. Чуть ниже еще уже написали про проблему с кавычкой.

aitap в сообщении #1559423 писал(а):
Распечатайте значение строки r"'C:\Users\1234\OneDrive\Рабочий стол\'"+'y'+r".py". Что с ним не так? Скорее всего, дело в лишней кавычке, которая мешает интерпретировать её как полный путь с буквой диска.

Чтобы ловить такие ошибки самостоятельно, используйте отладчик и смотрите, с каким исключением падает программа.



Понял, спасибо, затупил я, однако)
photon в сообщении #1559424 писал(а):
Во-вторых, я вижу у вас там +'y'+. Вы уверены, что подставится введенное имя файла?
В-третьих, я бы рекомендовал собрать путь в кучу до того, как открывать файл - так будет проще его рассмотреть/проверить,

Спасибо большое! Не уверен, что подставится введенное имя файла.
Но программа даже в таком варианте не создает файл, даже через командную строку

Используется синтаксис Python
import os, pyperclip, subprocess

x = pyperclip.paste()    

print('Как назвать файл?')

y = input()

folder = 'C:/Users/1234/OneDrive/Рабочий стол'
file_name = f'{y}.py'
path = os.join(folder, filename)
with open(path ,'w') as tw:
     tw.write(r"import os, pyperclip, subprocess")

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:25 
Экс-модератор
Аватара пользователя


23/12/05
12046
попробуйте для отладки не на OneDrive, а где-то локально

-- Tue Jul 05, 2022 16:27:47 --

А еще я написал с ошибкой и вы ошибку скопировали: в одном случае я написал file_name, во втором - filename

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:30 


27/09/19
189
photon в сообщении #1559427 писал(а):
попробуйте для отладки не на OneDrive, а где-то локально

Попробовал на
Код:
D:/test/
. Не получилось, к сожалению, в том числе и через командную строку)
photon в сообщении #1559424 писал(а):
Для начала: не используйте слэши \ в пути 'C:\Users\1234\OneDrive\Рабочий стол\'
Комбинации \0, \a, \b, \t, \n, \v, \f, \r и, возможно, какие-то еще работают как управляющие символы. Либо \\ либо / вместо них.

Я раньше думал, что, если добавить $r$ перед кавычками, то проблем со слешами не будет) Спасибо)[/quote]

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:32 
Экс-модератор
Аватара пользователя


23/12/05
12046

(Оффтоп)

Вы пытаетесь написать программу, которая выводит свой код?

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:43 


27/09/19
189
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import os, pyperclip, subprocess

x = pyperclip.paste()    

print('Как назвать файл?')

y = input()

folder = 'D:/test/'
file_name = f'{y}.py'

print('1234766044')
n = input()

path = os.join(folder, file_name)

print('1234444')
k = input()

with open(path,'w') as tw:
     tw.write(r"import os, pyperclip, subprocess")
     tw.write(r"r'pyperclip.copy(r'"+x+"')")


Значение $n$ программа дает ввести, а значение $k$ уже не дает (и в том числе число перед этим не пишет второе). С учетом того, что значение file_name я исправил, эта строчка не нравится компилятору почему-то.

Используется синтаксис Python
path = os.join(folder, file_name)


Но почему - не знаю.

(Оффтоп)

photon в сообщении #1559429 писал(а):
[off]Вы пытаетесь написать программу, которая выводит свой код?

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

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:48 


09/05/16
138
kot-obormot в сообщении #1559430 писал(а):
эта строчка не нравится компилятору почему-то, насколько я понял. Но почему - не знаю. "path = os.join(folder, file_name)"
Верно, ошибка именно здесь. Если использовать отладчик (например), он поможет Вам увидеть исключение, с которым программа падает на этой строке: AttributeError: module 'os' has no attribute 'join'.

Вот документация по модулю os. Там можно найти, как правильно в данном случае нужно было делать join().

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 17:50 


27/09/19
189
Загуглил. Надо было импортировать os.path и еще все-таки os.path.join надо было написать) Осталось только сделать так, чтобы строчки не склеивались. Файл создался, но строчки склеились. Постараюсь погуглить еще))

-- 05.07.2022, 17:53 --

aitap в сообщении #1559431 писал(а):
. Если использовать отладчик (например), он поможет Вам увидеть исключение, с которым программа падает на этой строке: AttributeError: module 'os' has no attribute 'join'.

Вот документация по модулю os. Там можно найти, как правильно в данном случае нужно было делать join().

Спасибо, посмотрю)
Используется синтаксис Python
import os, pyperclip, subprocess, os.path

x = pyperclip.paste()    

print('Как назвать файл?')

y = input()
folder = 'D:/test/'
file_name = f'{y}.py'
path = os.path.join(folder, file_name)

with open(path,'w') as tw:
     tw.write(r"import os, pyperclip, subprocess")
     tw.write(r"r'pyperclip.copy(r'"+x+"')")


Вот так все работает, только строчки склеиваются) и с x проблема.

То есть в новый файл записывается вот эта строчка
Код:
import os, pyperclip, subprocessr'pyperclip.copy(r'os.path.join')


-- 05.07.2022, 18:02 --

Что-то я запутался) Не понимаю - как буфер обмена в текущий момент загнать в создаваемый файл и сохранить его там)

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 18:04 
Экс-модератор
Аватара пользователя


23/12/05
12046
kot-obormot в сообщении #1559432 писал(а):
Вот так все работает, только строчки склеиваются)

'\n' в конце строки, либо загоняйте ваши строки в list, а затем используйте writelines вместо write

-- Tue Jul 05, 2022 17:08:06 --

kot-obormot в сообщении #1559432 писал(а):
с x проблема

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

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 18:48 


09/05/16
138
kot-obormot в сообщении #1559432 писал(а):
Используется синтаксис Python
tw.write(r"r'pyperclip.copy(r'"+x+"')")
А что будет, если в буфере обмена, а потом и в переменной x окажется значение '); import os; os.system("удалить все файлы"); #?

Такая ситуация называется инъекцией. Чтобы её избежать, нужно специально превращать строки в строковые литералы (например, на Lua это делают при помощи string.format("%q", любое_значение)) или как-то по-другому их кодировать (например, в base64, где точно не может быть кавычек).

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение05.07.2022, 21:25 


27/09/19
189
photon в сообщении #1559433 писал(а):
может там и с Х проблема, но я бы для начала избавился от кавычечной чехарды, которую вы устроили. Для комбинации переменных и строк используйте f-strings - пример выше я давал

Спасибо! Я попробовал от неуместных кавычек избавиться. Получилось вот что.

Используется синтаксис Python
x = input()

copy = 'pyperclip.copy('

close = ')'

print(f'{copy}\'{x}\'{close}')

# результат будет на выходе такой pyperclip.copy('введенное значение x')


С этим вроде бы ок. Удобно работать с f, спасибо, не знал раньше про это, только про r знал.

Но дальше возникли проблемы, когда я попытался это применить.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import os, pyperclip, subprocess, os.path

x = pyperclip.paste()    

print('Как назвать файл?')

y = input()
folder = 'D:/test/'
file_name = f'{y}.py'
path = os.path.join(folder, file_name)
copy = 'pyperclip.copy('

close = ')'

with open(path,'w') as tw:
     tw.write(r"import os, pyperclip, subprocess \n {copy}/'{x}/'{close}")


Создается файл с вот только такой одной строчкой. Строчки почему-то не две.

Используется синтаксис Python
import os, pyperclip, subprocess /n {copy}/'{x}/'{close}


Слеши в разные стороны ставил, это ничего не меняет идейно в этом случае))

aitap в сообщении #1559435 писал(а):
А что будет, если в буфере обмена, а потом и в переменной x окажется значение '); import os; os.system("удалить все файлы"); #?

Вот этого я не знаю, к сожалению)
aitap в сообщении #1559435 писал(а):
Такая ситуация называется инъекцией
. Чтобы её избежать, нужно специально превращать строки в строковые литералы (например, на Lua это делают при помощи string.format("%q", любое_значение)
) или как-то по-другому их кодировать (например, в base64
, где точно не может быть кавычек).

Спасибо! Почему-то программа ругается на string. Говорит, что не знает - что это)) Я почитал по ссылке, но как эту ошибку убрать - не знаю.

 Профиль  
                  
 
 Re: Запоминалка на python. Короткая программа барахлит
Сообщение06.07.2022, 00:03 
Экс-модератор
Аватара пользователя


23/12/05
12046
kot-obormot в сообщении #1559456 писал(а):
С этим вроде бы ок. Удобно работать с f, спасибо, не знал раньше про это, только про r знал.

Нет, не ОК. Одна кавычка вначале, одна - вконце:
Используется синтаксис Python
tw.write(f'import os, pyperclip, subprocess\n{copy}{x}{close}')

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: TheRuinedMap


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group