Запуск одного скрипта из другого python

Как запустить скрипт питон из другого скрипта питон?

Как сделать так, что бы из одного скрипта питон запускался другой, с параметрами(a=1 например) и первый скрипт продолжался а после выполнения второй закрывался
нигде не могу найти как это сделать?
Python 3.7

deepblack

Импортируете модуль subprocess

import subprocess subprocess.Popen(['python3', 'script.py', 'argzzz1', 'argzzz2'])

UPD:
Путь к интерпретатору Python3

import sys >>> sys.executable '/usr/bin/python3'

Traceback (most recent call last):
File «tesst.py», line 4, in
subprocess.Popen([‘python3»config.py’],a,b)
File «/usr/local/lib/python3.7/subprocess.py», line 756, in __init__
restore_signals, start_new_session)
File «/usr/local/lib/python3.7/subprocess.py», line 1413, in _execute_child
executable = os.fsencode(executable)
File «/usr/local/lib/python3.7/os.py», line 809, in fsencode
filename = fspath(filename) # Does type-checking of `filename`.
TypeError: expected str, bytes or os.PathLike object, not int
такая ошибка

deepblack

Traceback (most recent call last):
File «tesst.py», line 5, in
subprocess.Popen([‘/usr/local/bin/python3.7′,’config.py’],a,b)
File «/usr/local/lib/python3.7/subprocess.py», line 756, in __init__
restore_signals, start_new_session)
File «/usr/local/lib/python3.7/subprocess.py», line 1413, in _execute_child
executable = os.fsencode(executable)
File «/usr/local/lib/python3.7/os.py», line 809, in fsencode
filename = fspath(filename) # Does type-checking of `filename`.
TypeError: expected str, bytes or os.PathLike object, not int

deepblack

Только что в консоли проверил

[GCC 8.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import subprocess >>> >>> subprocess.Popen(['python3', 'script.py', 'argzzz1', 'argzzz2']) >>> ['script.py', 'argzzz1', 'argzzz2']

Источник

Launch Script From Another Python Script

subprocess module in Python allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module can used for launching a script and/or executable from another python script.

Below script count for 10 and then exit with status success. We will use this script for demonstrating, how to launch this script from other script.

# File : count.py import time import sys def main(): loop_count = 0 while True: print('.', end='') loop_count += 1 if loop_count > 10: break time.sleep(1) print('END') sys.exit(0) if __name__ == '__main__': main()

Using subprocess.run

Below is the syntax of run() command

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, **other_popen_kwargs)

It run the command described by args. Wait for command to complete, then return a CompletedProcess instance.

  • The input argument is passed to Popen.communicate() and thus to the subprocess’s stdin. If used it must be a byte sequence, or a string if encoding or errors is specified or text is true. When used, the internal Popen object is automatically created with stdin=PIPE, and the stdin argument may not be used as well.
  • If capture_output is true, stdout and stderr will be captured.
  • The timeout argument is passed to Popen.communicate(). If the timeout expires, the child process will be killed and waited for. The TimeoutExpired exception will be re-raised after the child process has terminated.
  • If check is true, and the process exits with a non-zero exit code, a CalledProcessError exception will be raised. Attributes of that exception hold the arguments, the exit code, and stdout and stderr if they were captured.
  • If encoding or errors are specified, or text is true, file objects for stdin, stdout and stderr are opened in text mode using the specified encoding and errors or the io.TextIOWrapper default. The universal_newlines argument is equivalent to text and is provided for backwards compatibility. By default, file objects are opened in binary mode.
  • If env is not None, it must be a mapping that defines the environment variables for the new process; these are used instead of the default behavior of inheriting the current process’ environment. It is passed directly to Popen.

Launch Script

Below script launch a process to execute the python script (count.py), and wait until the process to complete.

import subprocess p = subprocess.run('python count.py', shell=True) # or #p = subprocess.run(['python', 'count.py']) print('returncode', p.returncode) print('EXIT')

Execute Shell Command

It can also be used to executing shell commands. It gives us the flexibility to suppress the output of shell commands or chain inputs and outputs of various commands together.

import subprocess list_files = subprocess.run(["ls", "-l"]) print("The exit code was: %d" % list_files.returncode)

Below example shows how to pass input to the command.

import subprocess useless_cat_call = subprocess.run(["cat"], stdout=subprocess.PIPE, text=True, input="cat input") print(useless_cat_call.stdout) # cat input

Using subprocess.Popen

Below is the syntax of Popen.

class subprocess.Popen(args, bufsize=- 1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, group=None, extra_groups=None, user=None, umask=- 1, encoding=None, errors=None, text=None, pipesize=- 1)

Execute a child program in a new process. The arguments to Popen are as follows.

  • args should be a sequence of program arguments or else a single string or path-like object. By default, the program to execute is the first item in args if args is a sequence. If args is a string, the interpretation is platform-dependent.
  • The shell argument (which defaults to False) specifies whether to use the shell as the program to execute. If shell is True, it is recommended to pass args as a string rather than as a sequence.
  • The executable argument specifies a replacement program to execute. It is very seldom needed. When shell=False, executable replaces the program to execute specified by args.
  • stdin, stdout and stderr specify the executed program’s standard input, standard output and standard error file handles, respectively. Valid values are PIPE, DEVNULL, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. DEVNULL indicates that the special file os.devnull will be used. With the default settings of None, no redirection will occur; the child’s file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout.

Below example launch a process to execute the python script, and does not wait for the script to complete.

import subprocess p = subprocess.Popen(['python3', 'count.py']) print('pid', p.pid) print('EXIT') # Output # pid 28730 # EXIT # . END

Process Interaction

Below script is addon version of the above script. It capture output and error of the called script. It also wait for launched process to finish. Finally it displays the output and error code.

import subprocess p = subprocess.Popen(['python3', 'count.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() print('Output : ', out) print('Error :', err) print('returncode', p.returncode)

Popen.communicate(input=None, timeout=None) interact with process. It send data to stdin, read data from stdout and stderr, until end-of-file is reached. It also wait for process to terminate and set the returncode attribute. Note that if you want to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE. Similarly, to get anything other than None in the result tuple, you need to give stdout=PIPE and/or stderr=PIPE too.

If the process does not terminate after timeout seconds, a TimeoutExpired exception will be raised. Catching this exception and retrying communication will not lose any output. The child process is not killed if the timeout expires, so in order to cleanup properly a well-behaved application should kill the child process and finish communication.

Changing stdout and stderr

Output and error can also be written to file as shown in below example.

with open("test.log","wb") as out, open("test-error.log","wb") as err: p = subprocess.Popen(['python', 'test.py'], stdout=out, stderr=err)

Run another Programming Language

We can run other programming languages with python and get the output from those files. For instance, let’s create a hello world program in C++. In order to execute the following file, you’ll need to install C++ compilers.

Below script executes the above C++ file. The script first scans all the C++ files in the current working directory and executes one by one.

from glob import glob import subprocess # Gets files with each extension cpp_files = glob('*.cpp') for file in cpp_files: process = subprocess.run(f'g++ -o out; ./out', shell=True, capture_output=True, text=True) output = process.stdout.strip() + '\nExecuting by Python' print(output)

Источник

Запустите скрипт Python из другого скрипта Python, передав аргументы [duplicate]

Я хочу запустить Python script из другого Python script. Я хочу передать переменные, как я бы использовал в командной строке. Например, я бы запускал свой первый script, который перебирал бы список значений (0,1,2,3) и передавал их во второй script script2.py 0 , затем script2.py 1 и т.д. Я нашел SO 1186789, который является аналогичным вопросом, но ars отвечает на вызовы функции, где, поскольку я хочу запустить целую script не только функцию, а вызов balpha вызывает script, но без аргументов. Я изменил это на что-то вроде ниже в качестве теста:

Но он не принимает правильные значения. Когда я печатаю sys.argv в файле script2.py, это первоначальный командный вызов с первым script «[‘C:\script1.py’]. Я не хочу менять исходный script (т.е. script2.py в моем примере), так как я его не владею. Я полагаю, что должен быть способ сделать это, я просто смущен, как вы это делаете.

Вопрос в том, знаете ли вы имя скрипта (затем импортируете его) или если вы не знаете имя скрипта во время программирования (тогда используйте subprocess.call). Во втором случае этот вопрос также не будет дубликатом. Поскольку вопрос не проясняет, он также не очень хороший.

@Trilarion: Триларион: неправильно. Вы можете импортировать модуль Python, даже если его имя генерируется во время выполнения.

@J.F.SebastianХорошо. В качестве дополнительного замечания: этот способ не очень хорошо описан ни в одном ответе здесь или в связанном вопросе, за исключением частично в stackoverflow.com/a/1186840/1536976 .

@Trilarion: почему это должно быть покрыто вообще? Имена зафиксированы в обоих вопросах. В любом случае, выражение «если вы не знаете имя скрипта во время программирования (тогда используйте subprocess.call)». не так, независимо. Если у вас есть новый вопрос; спроси

@J.F.SebastianСогласен снова. У меня нет вопросов прямо сейчас. Если я приду с одним, я обязательно спрошу.

@Oli4 Oli4 «определенно» — сильное слово. Хотите разработать? Я вижу решение subprocess.call (), которое принимает несколько аргументов командной строки. Я вижу, что import упоминается для случаев, когда определена функция main () (это не поможет OP, но это правильный путь для многих других людей с подобной проблемой). Я вижу execfile () для Python 2, который использует все, что вы положили в sys.argv (правда, последний бит не упоминается явно) — эта опция должна игнорироваться новичками. Существует даже явный ответ os.system () с несколькими аргументами (ответ, который принимается здесь).

@J.F.SebastianПосле вашей разработки, я склонен согласиться с вами. Хотя в другом вопросе явно не указано, как отправлять аргументы или что это требуется, вопросы действительно похожи. Иногда, задавая вопрос по-разному, появляются разные решения, так как ответ ChrisAdams решил мою проблему. Я прошу прощения за мое предыдущее заявление о том, что это действительно не дубликат, и спасибо.

Источник

Читайте также:  Программируем на linux python
Оцените статью