Передача аргумента скрипта python в его функцию в качестве аргумента - PullRequest
0 голосов
/ 06 февраля 2020

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

Следующее работает внутри python shell:

>>> result = client.call('SoftLayer_Hardware', 'getAllObjects', filter={'id': {'operation': '1442567'}}, limit=300, mask='mask[id, hostname, accountId, primaryIpAddress, softwareComponents[passwords], upstreamHardware[id, hostname], uplinkNetworkComponents[id, name, port, uplink[uplinkComponent[id, hardwareId, name, port]]]]')
>>> 

Этот способ также работает должным образом:

>>> var_f = {'id': {'operation': '1442567'}}
>>> var_m = "mask[id, hostname, domain, accountId, datacenter, networkVlans, networkManagementIpAddress, primaryBackendIpAddress, primaryIpAddress, softwareComponents[modifyDate, passwords[username, password], softwareLicense[softwareDescriptionId, softwareDescription[longDescription]]], uplinkNetworkComponents[id, name, port, primaryIpAddress, networkVlanId, macAddress, speed, status, uplink[id, uplinkComponent[id, hardwareId, name, port, duplexModeId, maxSpeed, speed, status, networkPortChannelId, networkVlanId]]], upstreamHardware[id, hostname]]"
>>> result = client.call('SoftLayer_Hardware', 'getAllObjects', filter=var_f, limit=300, mask=var_m)
>>>

Однако, когда я пишу аналогичный код в файле сценария:

#!/usr/bin/python

import sys
import softlayer_api_common as ims
client = ims.connect_to_api(neteng_user=True)

filterinput = sys.argv[1]
maskinput = sys.argv[2]

print 'First argument'
print filterinput
print 'Second argument'
print maskinput

result = client.call('SoftLayer_Hardware', 'getAllObjects', filter=filterinput, limit=300, mask=maskinput)

sys.exit()

Затем вызываем его с двумя аргументами следующим образом: терпит неудачу:

$ ./imsquery "{'id': {'operation': '1442567'}}" "mask[id, hostname, domain, accountId, datacenter, networkVlans, networkManagementIpAddress, primaryBackendIpAddress, primaryIpAddress, softwareComponents[modifyDate, passwords[username, password], softwareLicense[softwareDescriptionId, softwareDescription[longDescription]]], uplinkNetworkComponents[id, name, port, primaryIpAddress, networkVlanId, macAddress, speed, status, uplink[id, uplinkComponent[id, hardwareId, name, port, duplexModeId, maxSpeed, speed, status, networkPortChannelId, networkVlanId]]], upstreamHardware[id, hostname]]"
First argument
{'id': {'operation': '1442567'}}
Second argument
mask[id, hostname, domain, accountId, datacenter, networkVlans, networkManagementIpAddress, primaryBackendIpAddress, primaryIpAddress, softwareComponents[modifyDate, passwords[username, password], softwareLicense[softwareDescriptionId, softwareDescription[longDescription]]], uplinkNetworkComponents[id, name, port, primaryIpAddress, networkVlanId, macAddress, speed, status, uplink[id, uplinkComponent[id, hardwareId, name, port, duplexModeId, maxSpeed, speed, status, networkPortChannelId, networkVlanId]]], upstreamHardware[id, hostname]]

Traceback (most recent call last):
  File "./imsquery", line 15, in <module>
    result = client.call('SoftLayer_Hardware', 'getAllObjects', filter=filterinput, limit=300, mask=maskinput)
  File "/usr/lib/python2.7/site-packages/SoftLayer/API.py", line 265, in call
    return self.transport(request)
  File "/usr/lib/python2.7/site-packages/SoftLayer/transports.py", line 247, in __call__
    raise exceptions.TransportError(ex.response.status_code, str(ex))
SoftLayer.exceptions.TransportError: TransportError(500): 500 Server Error: Internal Server Error for url: https://internal.applb.dal01.softlayer.local/v3/internal/xmlrpc/SoftLayer_Hardware
$

Видит, что входные аргументы скрипта берутся в переменные, однако возникают проблемы с использованием содержимого этих переменных при вызове функции, не работающей с этим синтаксисом. Есть предложения?

1 Ответ

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

Сбой из-за аргумента filterinput. Ожидается, что это будет dict тип как вход для внутренней функции. Но при переходе из командной строки он не конвертируется в dict автоматически. Здесь попробуйте напечатать ваш filterinput тип:

Вывод на печать:

...
First argument
{'id': {'operation': '1442567'}}
<class 'str'>
Second argument
...

Необходимо преобразовать его из str в dict вручную, используя json.loads(), например

Код:

#!/usr/bin/python

import sys
import json
import softlayer_api_common as ims
client = ims.connect_to_api(neteng_user=True)

filterinput = json.loads(sys.argv[1])
maskinput = sys.argv[2]
...

НО: Не забудьте использовать json стандарт в качестве аргумента, поэтому вместо "{'id': {'operation': '1442567'}}" вы должны передать '{"id": {"operation": 1442567}}':

$ ./imsquery '{"id": {"operation": 1442567}}' "mask[id, hostname, domain, accountId, datacenter, networkVlans, networkManagementIpAddress, primaryBackendIpAddress, primaryIpAddress, softwareComponents[modifyDate, passwords[username, password], softwareLicense[softwareDescriptionId, softwareDescription[longDescription]]], uplinkNetworkComponents[id, name, port, primaryIpAddress, networkVlanId, macAddress, speed, status, uplink[id, uplinkComponent[id, hardwareId, name, port, duplexModeId, maxSpeed, speed, status, networkPortChannelId, networkVlanId]]], upstreamHardware[id, hostname]]"

Вывод на печать:

First argument
{'id': {'operation': 1442567}}
<class 'dict'>
Second argument
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...