LINUX.ORG.RU

Python, os.system, как заставить принять больше 1 аргумента?

 


0

1

Сабж, код:

import standard_term
import os

def exec(arg):
     os.system(standard_term.standard_term, " python3 ", arg)


Но т.к os.system не принимает больше 1 аргумента,но и это не вышло.
Я не остановился, решил сделать переменую с типом tuple и затем превратить ее в строку посредствам ".join, но и это не вышло:
def exec(arg)
        command = ''.join(standard_term.standard_term," python3 ", arg) 
        os.system(command)

#Но получал такую ошибку:
TypeError: join() takes exactly one argument (3 given)

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

★★

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

смотри, как я делал управление службами в винде:

def service_info(action, service):
    if action == 'stop': 
        command = ['net', 'stop', service]
        print (command)
        p = subprocess.run (command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return (p.stdout if p.stdout else p.stderr).decode(encoding)
    
    elif action == 'start': 
        command = ['net', 'start', service]
        print (command)
        p = subprocess.run (command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        return (p.stdout if p.stdout else p.stderr).decode(encoding)
    
    elif action == 'restart': 
        res = ''
        res = res + service_info('stop', service) + "\n"
        res = res + service_info('start', service)
        print (res)
        return res
        #command = ['net', 'stop', service, '&&', 'net', 'start', service]
        #print (command)
        #p = subprocess.run (command)
        #return p.stdout if p.stdout else p.stderr
    
    elif action == 'status':
        command = ['net', 'status', service]
        print (command)
        p = subprocess.run (command)
        return p.stdout if p.stdout else p.stderr

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

Сделал так:

def exec(arg):
    command = [standard_term.standard_term," python3 ", arg]
    command_in_string = ''.join(command)    
    os.system(command_in_string)

И заработало! Огромное спасибо, оказывается надо было делать переменную с типом list, а не tuple и в таком случае join ее спокойно может в строку перевести

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

У тебя там не было tuple, у тебя там было ТРИ отдельных аргумента, а join принимает один - последовательность.

anonymous
()
Ответ на: комментарий от anonymous
>>> subprocess.run(['ls | grep x'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/subprocess.py", line 383, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.5/subprocess.py", line 676, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1282, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'ls | grep x'



И с os.system

 os.system('ls|grep x')
256


Если честно то я не понял почему в subprocess не завелось, но мне пока хватает os.system(использую для того что бы запускать код в своем редакторе)

playX ★★
() автор топика
Последнее исправление: playX (всего исправлений: 2)
Ответ на: комментарий от playX
def exec(arg):
    command = [standard_term.standard_term," python3 ", arg]
    command_in_string = ''.join(command)    
    os.system(command_in_string)
exec('test.py;rm -rf /')

Сам догадаешься, чем плох твой код?

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

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

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

Один вопрос:Как может запустится стороняя команда по типу rm -rf если запускается команда примерно так:
В коде есть self.fname, его можно использовать только когда открыл файл с помощью QfileDialog, следовательно этот self.fname будет использован для того что бы найти необходимый путь до файла, и выглядеть в конечном виде все будет примерно так:

xterm -e python3 /path/tofile.py/
В таком случае я проблем не вижу.
P.S Сам код который запускает файл:
    def open(self):
        self.fname = QFileDialog.getOpenFileName()[0]
        if self.fname != '':
            f = open(self.fname, 'r')
            with f:
                data = f.read()
                self.plainTextEdit.setPlainText(data)
    def execute(self):
        # Пока что не сделал проверку существует ли файл
        execute.exec(self.fname)

Aswed Учту это и как буду за компьютером сделаю все через subprocess

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

А для чего вообще нужно такой файл создавать? И как этот rm -rf / сработает если программу например запустить не от рута? Можно сделать проверку на суффикс, и если есть `;` или `|`, то выдавать предупреждение что программу потенциально опасно запускать, я скорее всего так и сделаю, но в данный момент я не за ПК, а так с радостью бы все поправил

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

А для чего вообще нужно такой файл создавать?

Ты можешь гарантировать что он не появиться?

И как этот rm -rf / сработает если программу например запустить не от рута?

Если создать файл 'super.py;rm -rf ${HOME};#.py'. Тебе легче будет?

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

А для чего вообще нужно такой файл создавать?

Затем, чтобы использовать уязвимость в твоей программе. rm -rf / - это просто пример, там может быть любой bash-скрипт. Использование os.system или его аналогов - это плохая практика независимо от языка, тебе приходит строка и ты передаешь её на выполнение интерпретатору - это дыра, нет, это ДЫРЕНЬ в безопасности.

Можно сделать проверку на суффикс, и если есть `;` или `|`, то выдавать предупреждение что программу потенциально опасно запускать, я скорее всего так и сделаю

Просто используй subprocess и не нужно будет выдумывать себе сложности на ровном месте.

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

оказывается надо было делать переменную с типом list, а не tuple и в таком случае join ее спокойно может в строку перевести

Измельчали юные питонисты, даже стандартные типы данных не знают.

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

Надеюсь, у тебя arg приходит не от пользователя. В противном случае я бы посоветовал тебе его экранировать. Но советовать не буду, потому что используй subprocess.

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

arg это путь до файла,так что пользователь не может его сам указать,но я уже все через subprocess сделал,осталось в Github залить

playX ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.