【问题标题】:TypeError: Must be str, not int error occuringTypeError:必须是 str,而不是发生 int 错误
【发布时间】:2018-04-26 23:39:06
【问题描述】:

我正在尝试将数据从 CGI 脚本发送到 C 服务器,以便将数据写入 XML 文件。

客户端.cgi:

import cgi, cgitb
import os
import sys
import argparse
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings()
import sys
import socket


form = cgi.FieldStorage()


#--PARSING THE ARGUMENTS
#--To be used to get arguments from Command Line or Php Script
parser = argparse.ArgumentParser(description ='parser script')
parser.add_argument('--serverId', required=True, help='Server ID to find device info')
parser.add_argument('--name', required=True, help='Name Of the Policy')
parser.add_argument('--host', default='any', help='Host of the IP Address')
parser.add_argument('--port', default='any', help='Port used')
parser.add_argument('--proto', default='any', help='Protocol used')
parser.add_argument('--username', default='any', help='Username')
parser.add_argument('--password', default='any', help='Password')
parser.add_argument('--key', default='any', help='')
parser.add_argument('--companyName', default='any', help='Name of the Company')
parser.add_argument('--officeAddress', default='any', help='Address of the Company')
parser.add_argument('--state', default='any', help='State')
parser.add_argument('--country', default='any', help='Country')
parser.add_argument('--ladmin', default='any', help='Local Admin')
parser.add_argument('--phone', default='any', help='Phone Number')
parser.add_argument('--mobile', default='any', help='Mobile Number')
parser.add_argument('--email', default='any', help='Email Address')
parser.add_argument('--designation', default='any', help='Designation of the concerned')
parser.add_argument('--rManager', default='any', help='Reporting Manager of the concerned Person')

args = parser.parse_args()


#--Associating variables to parsed arguments
serverId = str(args.serverId)
name = str(args.name)
host = str(args.host)
port = str(args.port)
proto = str(args.proto)
user = str(args.username)
password = str(args.password)
key = str(args.key)
company = str(args.companyName)
officeAddr = str(args.officeAddress)
state = str(args.state)
country = str(args.country)
ladmin = str(args.ladmin)
phone = str(args.phone)
mobile = str(args.mobile)
email = str(args.email)
designation = str(args.designation)
reportingMgr = str(args.rManager)

def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 8888  # socket server port number

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # instantiate
    client_socket.connect((host, port))  # connect to the server

    sum = serverId+";"+name+";"+host+";"+port+";"+proto+";"+user+";"+password+";"+key+";"+company+";"+officeAddr+";"+state+";"+country+";"+ladmin+";"+phone+";"+mobile+";"+email+";"+designation+";"+reportingMgr

    client_socket.sendall(sum.encode('utf-8'))
    data = client_socket.recv(1024)
    text = str(data)

    print('received:' +text)
    print('closing socket')
    client_socket.close()

if __name__ == '__main__':
    client_program()

当通过命令行传递参数时

python dscr.cgi --serverId PA124 --name Devanshu

我收到如下回溯电话

Traceback (most recent call last):
  File "dscr.cgi", line 90, in <module>
    client_program()
  File "dscr.cgi", line 79, in client_program
    sum = serverId+";"+name+";"+host+";"+port+";"+proto+";"+user+";"+password+";"+key+";"+company+";"+officeAddr+";"+state+";"+country+";"+ladmin+";"+phone+";"+mobile+";"+email+";"+designation+";"+reportingMgr
TypeError: must be str, not int

我意识到这不过是一个愚蠢的错误,但我无法找出是什么。提前感谢您的帮助。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    以下行替换

    port = 8888  # socket server port number
    

    port = '8888'  # socket server port number
    

    或者您可以在形成连接字符串之前键入强制转换,因为字符串连接操作只能使用另一个字符串完成,即替换

    sum = serverId+";"+name+";"+host+";"+port+";"+proto+";"+user+";"+password+";"+key+";"+company+";"+officeAddr+";"+state+";"+country+";"+ladmin+";"+phone+";"+mobile+";"+email+";"+designation+";"+reportingMgr
    

    sum = serverId+";"+name+";"+host+";"+str(port)+";"+proto+";"+user+";"+password+";"+key+";"+company+";"+officeAddr+";"+state+";"+country+";"+ladmin+";"+phone+";"+mobile+";"+email+";"+designation+";"+reportingMgr
    

    【讨论】:

      【解决方案2】:

      您的port 变量是一个int,您必须先将其转换为str

      您实际上在某个时刻将port 转换为str,但后来将其分配给函数范围内的一个int:port = 8888
      也许是一些调试代码的残余?

      #                                       **here**
          sum = serverId+";"+name+";"+host+";"+str(port)+";"+proto+";"+user+";"+password+";"+key+";"+company+";"+officeAddr+";"+state+";"+country+";"+ladmin+";"+phone+";"+mobile+";"+email+";"+designation+";"+reportingMgr
      

      在@COLDSPEED 建议下,您可以将所有这些参数分组并在它们上调用join

      arguments =  [serverId, 
                    name,
                    host,
                    str(port),
                    proto,
                    user,
                    password,
                    key,
                    company,
                    officeAddr,
                    state,
                    country,
                    ladmin,
                    phone,
                    mobile,
                    email,
                    designation,
                    reportingMgr]
      
      print(';'.join(arguments))
      

      【讨论】:

      • 当您使用它时,我会推荐一种方法来整齐地提取所有这些参数(例如,作为一个列表)并在它们上调用 ';'.join ;-)
      • 嘿,比手动输入所有内容都好。懒惰的人是优秀的程序员。 :-)
      • 但是,当我写 port = str(args.port) 时,我确实将它转换为上面的 str 。那么它不会被转换吗?谢谢,因为它确实有效。 :)
      • 是的,您确实这样做了,但是,您在函数范围内再次分配端口:`port = 8888 # 套接字服务器端口号`...可能是一些调试代码的残余?
      • 答案已接受,因为您确实指出了我遇到的问题,并为我提供了更好的方法。我也会使用';'.join,但想问一下它是否比连接字符串更快?具体来说,编译速度更快..!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2018-07-23
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多