Команда, не найденная попыткой сценария Python для удара

Я пытаюсь выполнить команду удара из сценария Python после рассмотрения этих видео (1, 2). Это - мой первый раз, пробуя это.

Мой сценарий:

import os
import subprocess

os.system("cd Downloads/smartgit")
#  os.system("cd Downloads/smartgit/bin")
#  os.system('sudo "bin/smartgit.sh"')
#  os.system("sudo bin/smartgit.sh")
#  os.system("sudo ./smartgit.sh")
#  subprocess.call("./smargit.sh", shell=True)
#  subprocess.call("sudo ./smargit.sh", shell=True)
#  subprocess.call("sudo smargit.sh", shell=True)
subprocess.call("bin/smargit.sh", shell=True)

Вы видите мои более ранние прокомментированные воплощения. Я chmod'd файл, но ни один это:

malikarumi@Tetuoan2:~/Downloads/smartgit/bin$ cd ~
malikarumi@Tetuoan2:~$ python smartgit.py
sh: 1: bin/smartgit.sh: not found

Ни это:

malikarumi@Tetuoan2:~$ python smartgit.py
sudo: bin/smartgit.sh: command not found

Обработанный, и я не добираюсь почему, потому что это:

malikarumi@Tetuoan2:~$ cd Downloads/smartgit
malikarumi@Tetuoan2:~/Downloads/smartgit$ bin/smartgit.sh

делает!

Спасибо за помощь мне понять и исправляют этот сценарий.

0
задан 11 September 2017 в 04:26

3 ответа

Почему Вы используете Python, если все, что Вы делаете с ним, должно вызвать команды оболочки? Простой сценарий оболочки делал бы это намного легче и как долго, большинство Ваших команд Python использует os.system или subprocess модуль, Вы в основном переносите сценарий оболочки в программе Python (с дополнительными ловушками), который потребовал бы, чтобы Вы изучили некоторую оболочку, пишущую сценарий так или иначе.

Вот то, как можно достигнуть того же (насколько я понимаю это) со сценарием оболочки:

#!/bin/sh
cd Downloads/smartgit
bin/smargit.sh

Или проще:

Downloads/smartgit/bin/smargit.sh
1
ответ дан 2 November 2019 в 07:05

Не имеет никакого смысла работать cd команды в функции Python os.system(...), поскольку каждый из тех вызовов порождает свою собственную, отдельную оболочку внутри, которую выполняет команда, которые не влияют на основной процесс или оболочки других вызовов функции. Поэтому cd из одного вызова не влияет на рабочий каталог других вызовов.

можно использовать os.chdir(...) вместо этого для изменения рабочего каталога целого процесса Python.

Однако Вы не должны полагаться на неявные относительные пути как это в Вашем приложении, это повредится, если Вы запустите скрипт от какого-либо другого местоположения, чем корневой каталог. Возможно, Вы хотите снабдить префиксом путь ~/, чтобы быть относительно Вашего корневого каталога.

3
ответ дан 2 November 2019 в 07:05

os.system() запускает оболочку, выполняет команду и завершения та оболочка. Ваш cd эффект потерян. каталог Change с самим Python :

os.chdir("Downloads/smartgit")
subprocess.call(["bin/smargit.sh"])

Еще лучше, который chdir вообще? Почему не непосредственно называют сценарий:

smartgit_path = os.path.expanduser("~/Download/smartgit/bin/smartgit.sh")
subprocess.call([smartgit_path])
3
ответ дан 2 November 2019 в 07:05

Другие вопросы по тегам:

Похожие вопросы: