传递python脚本';将参数转换为其作为参数的函数

传递python脚本';将参数转换为其作为参数的函数,python,function,arguments,Python,Function,Arguments,我正在尝试编写一个python脚本,它需要获取输入参数,以便在调用函数时在脚本内部使用 以下是python shell内部的工作: >>> result = client.call('SoftLayer_Hardware', 'getAllObjects', filter={'id': {'operation': '1442567'}}, limit=300, mask='mask[id, hostname, accountId, primaryIpAddress, softw

我正在尝试编写一个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
$
$。/imsquery“{id':{'operation':'1442567'}”掩码[id,主机名,域,帐户id,数据中心,网络VLAN,网络管理IP地址,primaryBackendIpAddress,primaryIpAddress,软件组件[modifyDate,密码[用户名,密码],软件许可证[softwareDescriptionId,softwareDescription[longDescription]],上行链路网络组件[id,名称,端口,PrimaryPaddress,networkVlanId,macAddress,速度,状态,上行链路[id,上行链路组件[id,硬件id,名称,端口,duplexModeId,maxSpeed,速度,状态,networkPortChannelId,networkVlanId]],上游硬件[id,主机名]]
第一个论点
{'id':{'operation':'1442567'}
第二个论点
掩码[id、主机名、域、帐户id、数据中心、网络VLAN、网络管理IP地址、PrimaryBackendIP地址、PrimaryPaddress、软件组件[modifyDate、密码[username、password]、软件许可证[softwareDescriptionId、softwareDescription[longDescription]]、上行链路网络组件[id,名称,端口,PrimaryPaddress,networkVlanId,macAddress,速度,状态,上行链路[id,上行链路组件[id,硬件id,名称,端口,duplexModeId,maxSpeed,速度,状态,networkPortChannelId,networkVlanId]],上游硬件[id,主机名]]
回溯(最近一次呼叫最后一次):
文件“/imsquery”,第15行,在
结果=client.call('SoftLayer\u Hardware','getAllObjects',filter=filterinput,limit=300,mask=maskinput)
文件“/usr/lib/python2.7/site packages/SoftLayer/API.py”,第265行,在调用中
返回自动传输(请求)
文件“/usr/lib/python2.7/site packages/SoftLayer/transports.py”,第247行,在调用中__
引发异常。传输错误(例如响应状态代码,str(例如))
SoftLayer.exceptions.TransportError:TransportError(500):500服务器错误:url的内部服务器错误:https://internal.applb.dal01.softlayer.local/v3/internal/xmlrpc/SoftLayer_Hardware
$

看起来脚本的输入参数被引入变量中,但是在调用函数时使用这些变量的内容有问题,不能使用此语法。有什么建议吗?

由于参数
过滤器输入
,它失败了。它应该是
dict
类型,作为内部函数的输入。但是从命令行传递时,它不会自动转换为
dict
。在此处,尝试打印您的
filterinput
类型:

打印输出:

。。。
第一个论点
{'id':{'operation':'1442567'}
第二个论点
...
例如,您必须使用
json.loads()
手动将其从
str
转换为
dict

代码:

!/usr/bin/python
导入系统
导入json
将softlayer\u api\u common导入为ims
client=ims.connect\u to\u api(neteng\u user=True)
filterinput=json.loads(sys.argv[1])
maskinput=sys.argv[2]
...
但是:不要忘记对参数使用json标准,所以应该传递
{id:{operation':'1442567'}}而不是
{id:{“operation”:1442567}}

$。/imsquery'{“id”:{“operation”:1442567}'掩码[id,主机名,域,帐户id,数据中心,网络VLAN,网络管理IP地址,primaryBackendIpAddress,primaryIpAddress,软件组件[modifyDate,密码[username,password],软件许可证[SoftwareScriptionId,SoftwareScription[longDescription]],上行链路网络组件[id,名称,端口,PrimaryPaddress,networkVlanId,macAddress,速度,状态,上行链路[id,上行链路组件[id,硬件id,名称,端口,duplexModeId,maxSpeed,速度,状态,networkPortChannelId,networkVlanId]],上游硬件[id,主机名]]
打印输出:

第一个参数
{'id':{'operation':1442567}
第二个论点
...

在将filterinput类型更改为dict并按照您的建议更正json格式后,它立即起作用。非常感谢@trsvchnI,我很高兴听到这个消息!)顺便说一句,当您有如此复杂的参数输入时,建议使用
argparse