2013-12-13 5 views
1

Я зову питон скрипт из программы рубиновой как:передавая массив в качестве аргумента командной строки для питона сценария

sku = ["VLJAI20225", "VJLS1234"] 
qty = ["3", "7"] 
system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku} #{qtys}" 

Но я хотел бы получить доступ к элементам массива в сценарии питона. ИНТ сценарий питона:

print sys.argv[1]  
#gives [VLJAI20225, expected ["VLJAI20225", "VJLS1234"] 
print sys.argv[2] 
#gives VJLS1234]  expected ["3", "7"] 

Я чувствую, что пространство между элементами массива обрабатывает элементы массива в виде отдельных аргументов. Возможно, я ошибаюсь. Как я могу передать массив правильно. Благодаря

ответ

3

Вам необходимо найти подходящий протокол для кодирования ваших данных (вашего массива, списка и т. Д.) По выбранному вами интерфейсу (это очень верно довольно общее).

В вашем случае вы выбрали в качестве интерфейса механизм вызова процесса Unix, который позволяет только передавать список строк во время вызова. Этот список также довольно ограничен (вы не можете передать, скажем, гигабайт таким образом), поэтому вам может потребоваться передать данные через канал между двумя процессами.

В любом случае, все, что вы можете сделать, это передать байты, поэтому я предлагаю закодировать ваши данные соответствующим образом, e. г. как строка JSON. Это означает, что вы кодируете свой массив Ruby в JSON, передаете эту строку JSON, а затем декодируете на стороне Python полученную строку JSON, чтобы снова получить правильный список Python.

Это только зарисовывает подход и рассуждения позади него.

Поскольку я не свободно в Ruby, я оставлю эту часть к вам (см возможно @ ответ apneadiving на это), но на стороне Python вы можете использовать

import json 

myList = json.loads(s) 

преобразовать строку JSON s в список Python myList.

+0

Спасибо за очень полезный ответ. Но я получаю 'ValueError (« Нет объекта JSON может быть декодирован »)' после передачи '# {sku.to_json}' и '# {qtys.to_json}' – nish

+0

Я не могу говорить за Ruby, так что, может быть, вы просто хочу сделать отладочный вывод в части Python перед его расшифровкой из JSON, просто распечатайте строку JSON: 'print s' (или, вероятно,' print sys.argv [1] 'или аналогичный). – Alfe

+1

жаль, что я перепутался, это работает отлично. Большое спасибо за помощь Alfe – nish

2

Не специалист питон, но быстрое решение было бы использовать JSON:

system "python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py #{sku.to_json} #{qtys.to_json}" 

Затем разобрать в вашем питона скрипт.

+0

+1 для решения стороны Ruby :) – Alfe

1
"python2 /home/nish/stuff/repos/Untitled/voylla_staging_changes/app/models/ReviseItem.py \'#{sku}\' \'#{qtys}\'" 

Возможно, что-то вроде этого?

+0

Это работает, но массив передается как строка в скрипт python, но его можно преобразовать в список. Спасибо за подсказку – nish

Смежные вопросы