Я должен выполнить сценарии удара из Python с 'ударом' или '. / '?

Я записал сценарий Python, который выполняет некоторые сценарии удара как это:

cmd = subprocess.Popen(['bash', 'script.sh'])

Тем путем это выполняет сценарий, хотя я не установил, выполняют полномочия с chmod. Я могу также записать в терминале bash script.sh и это работает то же. Я знаю, что сценарии могут быть выполнены путем предварительного ожидания точечной наклонной черты ./ им как это ./script.sh.

Так, какой путь я должен использовать в своем сценарии Python? Почему?

6
задан 19 March 2017 в 00:46

1 ответ

Во-первых, что касается точки в ./script.sh, это указывает, что script.sh можно найти в рабочем каталоге, это означает что-то вроде «ищите script.sh здесь, в этом каталоге». Это известно как косая черта, и это хорошо объяснено здесь .

Я вижу три варианта:

  1. Если вы намерены ограничить запуск файла, только если он находится в текущем рабочем каталоге пользователя , когда он запускает ваш Python сценарий, затем используйте косую черту. Тем не менее, это не самая лучшая идея: большую часть времени это приведет к исключениям.

  2. Если вы намереваетесь ограничить выполнение сценария оболочки только в том случае, если он находится в том же каталоге, что и ваш сценарий Python, то вам необходимо найти каталог сценария Python [ 114] и добавьте его к имени вашего скрипта.

  3. Если вы намереваетесь разместить свой сценарий оболочки в другом месте вашей переменной PATH, не используйте косую черту.

Теперь отправка «bash» в качестве аргумента конструктору Popen выглядит скорее как вопрос предпочтений. Если вы не хотите отправлять его в качестве аргумента, вам нужно добавить шебанг в сценарий оболочки, например, #!/bin/bash, и вам нужно будет добавить разрешения на выполнение к нему. Это совершенно приемлемые вещи.

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

И можно просто назвать скрипт как:

cmd = subprocess.call('script.sh')
# or
cmd = subprocess.call(sdir + 'script.sh')
# Where sdir stands for the script's directory,
# which you would need to find before, as in option #2.

Примечания:

Даже если ваш скрипт работает без шебанга (в котором если он почти наверняка выполняется с помощью dash, а не bash в дистрибутивах на основе Debian), при вызове его из python, как этот, он завершится с ошибкой и вызовет исключение OSError с ошибкой 8 (errno.ENOEXEC). [ 119]

Если это действительно необходимо, используйте Popen .

10
ответ дан 23 November 2019 в 07:30