как передать переменную python в функцию скрипта bash - PullRequest
1 голос
/ 05 февраля 2020

Я искал и искал и искал, но не нашел и не ответил на мою конкретную ситуацию, или, если у меня есть, я не знаю, как это реализовать. Я пытаюсь создать скрипт, используя python и bash, чтобы автоматизировать процесс создания моего проекта. Принимая во внимание, что я запускаю test.py «как он называется сейчас, потому что я тестирую» с 1 аргументом командной строки, который будет именем папки проекта, тогда он будет спрашивать «где я хотел бы создать проект» с два варианта путей для сохранения проекта и сохранения пути с помощью оператора if в переменную пути. затем я хотел бы передать эту переменную в скрипте bash, чтобы перейти к ней и создать там каталог проекта. вот что у меня есть:

, поэтому команда, которую я буду запускать, будет выглядеть так:

python testing.py newProject

в .test. sh

#!/bin/bash

function testing() {
    cd 
    desktop
    python testing.py $1

}

и в testing.py

import sys
import os

school = "/Users/albert/Open/Microverse/"
personal = "/Users/albert/Open/code/Projects/"

path = " "

userInput = input("What type of project would you like to create? Personal or School? ")

if userInput.lower() == "personal":
    path = personal
elif userInput.lower() == "school":
    path = school


def testing():
    folderName = str(sys.argv[1])
    os.makedirs(path + str(folderName))
    print(folderName)


if __name__ == "__main__":
    testing()

Ответы [ 3 ]

0 голосов
/ 05 февраля 2020

Вы должны запустить свою bash функцию следующим образом

testing $1

Весь сценарий

#!/bin/bash

function testing() {
    cd
    desktop
    python test.py $1
}

testing $1

И изменить input() на raw_input() в вашей python части , Функция input (), возвращающая функцию, на самом деле оценит входную строку и попытается запустить ее как Python код. И если я попытаюсь ввести Personal, то это выдаст мне ошибку

What type of project would you like to create? Personal or School? Personal
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    userInput = input("What type of project would you like to create? Personal or School? ")
  File "<string>", line 1, in <module>
NameError: name 'Personal' is not defined

И если вы введете personal, тогда userInput будет /Users/albert/Open/code/Projects/, чего вам не нужно, верно?

0 голосов
/ 05 февраля 2020

Полагаю, desktop на самом деле не является действительной командой, и вам действительно нужно

testing () {
    cd ~/Desktop
    python test.py "$1"
]

Лучшим вариантом может быть не принудительное создание всех проектов внутри папки рабочего стола, хотя .

testing () {
   python ~/Desktop/test.py "$1"
}

позволит вам запустить скрипт в любом каталоге.

Еще лучше было бы придать скрипту надлежащий шебанг, отметить его исполняемым, назвать его testing, и сохраните его в своем PATH; тогда вам вообще не нужна функция оболочки.

Другой и ИМХО более удобный подход состоял бы в том, чтобы позволить пользователю указывать «личный» или «школьный» как часть командной строки вместо принудительного использования скрипт для использования интерактивного ввода. Потребность в интерактивном вводе-выводе усложняет использование сценария в качестве строительного блока для дальнейшей автоматизации и лишает пользователя возможности использовать функции истории и завершения оболочки.

Следующий рефакторинг жестких кодов очень грубый анализатор параметров и использует dict для сопоставления типа проекта с указанным c именем папки.

#!/usr/bin/env python3

import sys
import os

paths = {
  "school": "/Users/albert/Open/Microverse/"
  "personal": "/Users/albert/Open/code/Projects/"
}

def makeproject(type, folder):
    os.makedirs(os.path.join(path, folder))

def gettype():
    while True:
        userInput = input("What type of project would you like to create? Personal or School? ")
        if userInput in paths:
            return paths[userInput]
        print("Not a valid option: {} -- try again".format(userInput))

def testing():
    idx = 1
    if sys.argv[idx] == "--school":
        type = paths["school"]
        idx = 1
    elif sys.argv[idx] == "--personal":
        type = paths["personal"
        idx = 2
    else:
        type = gettype()
    folderName = sys.argv[idx]
    makeproject(type, folderName)
    print(folderName)

if __name__ == "__main__":
    testing()

Обратите внимание, что sys.argv и значение, возвращаемое input, уже являются строками; нет необходимости звонить str() на них.

0 голосов
/ 05 февраля 2020

Используйте «$ 1» вместо $ 1, как показано ниже

python testing.py "$1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...