Как использовать сценарий оболочки в программе Python? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу использовать скрипт C-shell в программе на Python, который работает с двумя аргументами.

os.system("recall 20170121 ../E725.txt xy 1")

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

date_ID=(filename[17:25])
fullpath = '../%s' % (filename)
os.system("import_S1_TOPS_modified $date_ID $fullpath vv 1")

1 Ответ

0 голосов
/ 23 октября 2018

Оболочка не знает о переменных Python, так как это совершенно другая система.Таким образом, вы не можете использовать механизм подстановки переменных оболочки ($date_ID).Вместо этого вам нужно будет передать их в виде строки Python:

os.system("import_S1_TOPS_modified %s %s vv 1" % (date_ID, fullpath))

Обратите внимание, что у этого кода есть серьезная проблема: что, если кто-то выдаст ; rm -rf /; как filename?команда теперь будет выглядеть так:

import_S1_TOPS_modified 20181021; rm -rf /; vv 1

, которая удалит все.

Вот почему лучше использовать subprocess, который вообще не будет использовать оболочку,и не подвержен подобным проблемам:

subprocess.call(['import_S1_TOPS_modified', date_ID, fullpath, 'vv', '1'])

Если вам нужно использовать оболочку, используйте shlex.quote() и добавьте shell=True:

subprocess.call("import_S1_TOPS_modified %s %s vv 1" % (
    shlex.quote(date_ID), shlex.quote(fullpath)),
    shell=True)
...