передача аргумента в python из скрипта оболочки - PullRequest
0 голосов
/ 13 июня 2019

Я перебрал несколько похожих вопросов, но ни один из них не отвечает на мои сомнения, я пытаюсь передать аргумент скрипту python из моего скрипта bash.Я не вижу ошибок и не получаю требуемый результат.Что я тут не так делаю?

python:


import os
import glob
import unicodecsv as csv
import pandas as pd
import codecs
import sys




OUTPUT_PATH=sys.argv[2] 


def createFolder(directory):
  # print('createFolder')
  try:
        if not os.path.exists(directory):
            # print('createFolder')
            os.makedirs(directory)
            # print(directory)
  except OSError:
        print ('Error: Creating directory. ' +  directory)
createFolder(OUTPUT_PATH + 'csv20_out/')

bash script:

INPUT_PATH='home/pg/Public/test_data/test0002_2files_to_1flow/csv64_in/'
OUTPUT_PATH='home/pg/Public/test_data/test0002_2files_to_1flow/'

cd /
cd home/pg/Documents/LMS/kanjiforbeginner/convertToYAML/


cd converts_csv642csv20
python csvFile.py $INPUT_PATH $OUTPUT_PATH

Должен ли я создавать папку csv20_out

при печатиOUTPUT_PATH, я получаю 'home / pg / Public / test_data / test0002_2files_to_1flow /'

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

Содержимое sys.argv выглядит так:

['csvFile.py', 'inputPath', 'outputPath']

Чтобы получить outputPath, вам необходим доступ к sys.argv [2] в вашем случае.

0 голосов
/ 13 июня 2019

Итак, как отмечали другие комментаторы, вам нужно использовать argv[2] вместо argv[1] Это связано с тем, что в bash argv[0] выполняется сценарий python, а argv[1] в вашем случае становится '$INPUT_PATH'

Но это не решит твою проблему. В вашем скрипте вам нужно удалить ', окружающие $INPUT_PATH и $OUTPUT_PATH, чтобы последняя строка стала,
python csvFile.py $INPUT_PATH $OUTPUT_PATH

'$INPUT_PATH' отправляет string $INPUT_PATH вашему скрипту на python, тогда как

$INPUT_PATH отправляет 'home/pg/Public/test_data/test0002_2files_to_1flow/csv64_in/'

или любое другое значение, которое вы выбрали для $INPUT_PATH

И, наконец, вам нужно изменить значения $INPUT_PATH и $OUTPUT_PATH
INPUT_PATH='home/pg/Public/test_data/test0002_2files_to_1flow/csv64_in/' OUTPUT_PATH='home/pg/Public/test_data/test0002_2files_to_1flow/'

должно стать

INPUT_PATH='/home/pg/Public/test_data/test0002_2files_to_1flow/csv64_in/' OUTPUT_PATH='/home/pg/Public/test_data/test0002_2files_to_1flow/'

/ в начале дает полный путь к каталогу или файлу, если вы не использовали /, то он становится относительным путем.

В вашем bash-скрипте вы перемещаетесь по папкам, используя в результате cd, папка

'home/pg/Public/test_data/test0002_2files_to_1flow/csv_out'

будет создано в каталоге,

home/pg/Documents/LMS/kanjiforbeginner/convertToYAML/

Добавление / в начале к $INPUT_PATH и $OUTPUT_PATH, как показано выше, гарантирует, что ваш код:

  • ищет ввод в нужном каталоге
  • создает папку в нужном каталоге

редактирование:

Как Ким предложил ниже, последняя строка в скрипте должна быть:

python csvFile.py "$INPUT_PATH" "$OUTPUT_PATH"

Это в случае, если $INPUT_PATH или $OUTPUT_PATH содержит пробелы или специальные символы.

0 голосов
/ 13 июня 2019

По соглашению первый аргумент - это имя самой программы, то есть первое, что указывается в командной строке (whatever_name.py).

Итак, argv[0] - это имя программы, argv[1] - это ваш входной путь, а argv[2] - ваш выходной путь.

...