Я пытаюсь выполнить команду удара из сценария 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
делает!
Спасибо за помощь мне понять и исправляют этот сценарий.
Почему Вы используете Python, если все, что Вы делаете с ним, должно вызвать команды оболочки? Простой сценарий оболочки делал бы это намного легче и как долго, большинство Ваших команд Python использует os.system
или subprocess
модуль, Вы в основном переносите сценарий оболочки в программе Python (с дополнительными ловушками), который потребовал бы, чтобы Вы изучили некоторую оболочку, пишущую сценарий так или иначе.
Вот то, как можно достигнуть того же (насколько я понимаю это) со сценарием оболочки:
#!/bin/sh
cd Downloads/smartgit
bin/smargit.sh
Или проще:
Downloads/smartgit/bin/smargit.sh
Не имеет никакого смысла работать cd
команды в функции Python os.system(...)
, поскольку каждый из тех вызовов порождает свою собственную, отдельную оболочку внутри, которую выполняет команда, которые не влияют на основной процесс или оболочки других вызовов функции. Поэтому cd
из одного вызова не влияет на рабочий каталог других вызовов.
можно использовать os.chdir(...)
вместо этого для изменения рабочего каталога целого процесса Python.
Однако Вы не должны полагаться на неявные относительные пути как это в Вашем приложении, это повредится, если Вы запустите скрипт от какого-либо другого местоположения, чем корневой каталог. Возможно, Вы хотите снабдить префиксом путь ~/
, чтобы быть относительно Вашего корневого каталога.
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])