Подтвердить что ты не робот

Выполнение командной строки в другой папке

Я вызываю программу командной строки в python, используя вызов os.system(command).

Как я могу вызвать эту команду для передачи другой папки для выполнения? Есть системный вызов для этого? Или я должен сохранить текущую папку, а после выполнения изменить ее восстановить.

4b9b3361

Ответ 1

Модуль subprocess - очень хорошее решение.

import subprocess
p = subprocess.Popen([command, argument1,...], cwd=working_directory)
p.wait()

Он также имеет аргументы для изменения переменных среды, перенаправления ввода/вывода на вызывающую программу и т.д.

Ответ 2

Попробуйте os.chdir(path) прежде чем os.chdir(path) команду.

Отсюда:

os.chdir (путь) Изменить текущий рабочий каталог на путь.

Доступность: Unix, Windows

РЕДАКТИРОВАТЬ

Это изменит текущий рабочий каталог, вы можете получить текущий рабочий:

os.getcwd()

Если вы хотите сохранить его и восстановить позже, если вам нужно выполнить какую-то работу в исходном рабочем каталоге.

РЕДАКТИРОВАТЬ 2

В любом случае вам, вероятно, следует перейти к subprocess (doc), как предлагается здесь. Если вы используете subprocess Popen вы можете cwd параметр cwd чтобы указать рабочий каталог для подпроцесса: прочитайте это.

subprocess.Popen(args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)

...

Если cwd не None, текущий каталог потомка будет изменен на cwd до его выполнения. Обратите внимание, что этот каталог не учитывается при поиске исполняемого файла, поэтому вы не можете указать путь к программам относительно cwd.

Ответ 3

Здесь я сделал небольшую функцию для изменения пути, над которым вы работаете:

import os
def make_path(r_path):  
    ack = 1
    try:
        root = os.path.dirname(__file__)
        rel_path = os.path.join("..", r_path)

        abs_path = os.path.join(root, rel_path)
        os.chdir(abs_path)
        ack = 0
    except Exception as details:
        print('problem to get to the path '+r_path+' (0001) : ' + str(details))
    return ack

Здесь r_path - это относительный путь, по которому вы хотите пойти. Я добавил ".." в метод path.join() поэтому, если вы находитесь в папке и хотите выйти из нее перед поиском пути, она делает это автоматически. Итак, если ваш относительный каталог выглядит так:

-path_to_reach
    -a_random_file.txt
-your_current_folder
    -your_program.py

Вы можете сделать эти строки, чтобы войти в path_to_reach и сделать свою команду, в качестве примера:

command = ls
make_path('path_to_reach/')
os.system(command)

Эта команда не будет полезна, но вы видите идею!