#python #python-3.x #string #file #command
#питон #python-3.x #строка #файл #команда
Вопрос:
Я написал код python в файле (предположим file_0.py ), в котором я пишу файл python с увеличивающимся индексом (например file_1.py ). Индекс считывается и сохраняется в index.txt файл и увеличивается по всему коду.
import os
def write_fun_and_call():
with open(__file__, 'r') as current_file:
fun_str = current_file.read()
with open("index.txt", 'r') as init_file:
i = int(init_file.read())
i = 1
with open("index.txt", 'w') as init_file:
init_file.write(str(i))
python_file = "fun_" str(i) ".py"
with open(python_file, 'w') as pyFile:
pyFile.write(fun_str)
# os.system("python " python_file)
return
write_fun_and_call()
Мой вопрос: «Если я раскомментирую строку (os.system) и запущу код, безопасно ли это, или возникнет какая-то проблема с памятью, а также что произойдет, если я смогу управлять индексом, в этом случае все в порядке?»
Заранее спасибо.
Комментарии:
1. exec — лучший способ для этого, считайте строки в файле в строковую переменную python, а затем вызывайте exec(var)
2. Это полностью зависит от того, что было во входном файле; но, вообще говоря, нет, вы не можете гарантировать, что в файле нет ничего плохого, и вы должны выполнять только проверенный вами код. В любом случае это кажется плохим решением для любой мыслимой постановки задачи и очень похоже на проблему XY ; чего вы на самом деле надеетесь достичь здесь?
3. Поскольку все ранее запущенные процессы остаются в памяти или перемещаются в (также ограниченный) файл подкачки, возникнет проблема с памятью, если вы не остановитесь достаточно рано.
4. Приведенный здесь код кажется достаточно сложным, что вы, возможно, сможете достичь «не очевидно небезопасного», но не «очевидно небезопасного». Описание вашей проблемы кажется довольно расплывчатым, но я бы смутно предложил поискать изолированную среду Python или реализовать собственную архитектуру виртуальной машины поверх Python, где вы можете более непосредственно контролировать, к чему может обращаться и изменять сгенерированный код.
5. @GautamJangid Точное количество возможных поколений до сбоя зависит от других действий операционной системы и, следовательно, меняется и не предсказуемо.
Ответ №1:
Нет, это небезопасно, если приложение работает в фоновом режиме, — для остановки улл должен выполнить другое действие. Если вы запустите его с консоли, вы можете нажать ctrl c для остановки.
import os
def write_fun_and_call():
with open(__file__, 'r') as current_file:
fun_str = current_file.read()
with open("index.txt", 'r ') as init_file:
i = int(init_file.read())
i = 1
init_file.seek(0)
init_file.write(str(i))
print(i)
if i>=10: #emergency stop
exit()
python_file = "fun_" str(i) ".py"
with open(python_file, 'w') as pyFile:
pyFile.write(fun_str)
os.system("python " python_file) #os.system(python_file) if python in systempath
return i
print(write_fun_and_call())
'''
1
2
3
4
5
6
7
8
9
10
9
8
7
6
5
4
3
2
1
'''
Первое приложение будет остановлено последним
Комментарии:
1. Вы проверили это, удалив комментарий (os.system)?
2. да, но я добавляю
if i>=10: exit();
для остановки, если я его удалю, я также могу остановить приложение с помощью ctrl c в терминале. Для действительно «небезопасного» использованияos.system('at ...
3. Вы только что остановили код, приняв условие i = 10; я не спрашиваю, я на самом деле спрашиваю, может ли код выполняться бесконечно долго, и мы можем управлять кодом, чтобы он не занимал большую память (либо в ОЗУ, либо в хранилище), и может использовать некоторую конкретную логику дляпроверьте поведение. Например, мы можем удалять старые индексированные файлы, контролируя инкрементное значение i и т. Д.
4. да, но для этого нужно вызвать функцию операционной системы.
os.system("start " python_file)
для Windows amp; есть способ остановить аварийную ситуацию — удалить ‘index.txt «и у нас будет исключение5. да, используйте
os.system("start /B " python_file)