Я пытаюсь написать 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
$
Видит, что входные аргументы скрипта берутся в переменные, однако возникают проблемы с использованием содержимого этих переменных при вызове функции, не работающей с этим синтаксисом. Есть предложения?