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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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