Объединить два URL-адреса внутри подпроцесса os.system в python - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в Python.Я пытаюсь автоматизировать исправления.

Ожидается, что вы извлечете файл из SVN и исправите его.Сначала пользователь введет URL-адрес, а вторым будет имя файла из хранилища.Я хочу экспортировать файл в мою локальную систему.У меня есть такой код,

 import os
 urlpath =input('Enter the URL')
 Filename =input('Enter the filename with Extension')
 os.system("svn export 'urlpath'+'/'+'Filename'")

Ввод: https://svn.abcdf.xyz имя файла: utility.java

Код должен экспортировать файл из https://svn.abcdf.xyz/utility.java.

Есть ли другой способ, которым я могу это сделать?или как объединить две разные переменные, которые должны быть разделены / внутри os.system.

1 Ответ

0 голосов
/ 28 марта 2019

Как уже указывалось в комментариях, аргумент os.system это просто строка;поэтому вы должны использовать обычные возможности форматирования строк Python для его создания.

import os
urlpath = input('Enter the URL')
filename = input('Enter the filename with extension')
os.system("svn export '{0}/{1}'".format(urlpath, filename))

Однако вам, вероятно, следует предпочесть subprocess.run, как строго указано в документации os.system.

import subprocess
urlpath = input('Enter the URL')
filename = input('Enter the filename with extension')
subprocess.run(['svn', 'export', urlpath+'/'+filename],
    check=True)

С check=True вы получите явную ошибку, если команда не выполнится (os.system сообщит вам только через состояние выхода, которое вы не проверяли), и поскольку мы не используем shell=True, это должно быть крошечнымнемного быстрееОбратите также внимание на то, что первый аргумент - это список токенов, а не строка, которую оболочка должна снова выделить (помните, что здесь сейчас нет оболочки).

subprocess.run() была введена в Python 3.5;если вам нужно поддерживать более старые версии, возможно, стоит попробовать заменить его на subprocess.check_call()

Гораздо лучший дизайн избавил бы от интерактивных вызовов input и позволил бы пользователю передавать параметры в качестве аргументов командной строки (sys.argv);Таким образом, вы получаете возможность использовать функции оболочки истории и дополнения имени файла, поэтому вам не нужно вводить имена файлов полностью вручную, и вы можете легко вызывать файлы, которые вы недавно использовали.Это также делает возможным создание дополнительной автоматизации вокруг вашего сценария, потому что тогда программы могут легко управлять другими программами.

import sys
import subprocess
import logging

if len(sys.argv) != 3:
    logging.error('syntax: {0} baseurl filename'.format(
        sys.argv[0].split('/')[-1}))
    sys.exit(2)

urlpath = sys.argv[1]
filename = sys.argv[2]
subprocess.run(['svn', 'export', urlpath+'/'+filename],
    check=True)
...