在Pycharm和Terminal中使用参数运行python脚本
我尝试通过python在Pycharm和Terminal中使用参数运行python脚本,python,python-3.x,encoding,python-requests,pycharm,Python,Python 3.x,Encoding,Python Requests,Pycharm,我尝试通过python请求向某些API发送授权请求。 代码看起来像 import requests import argparse import json URL = "some url" parser = argparse.ArgumentParser() parser.add_argument("username", help="Username") parser.add_argument("password", help="Password") args = parser.parse_
请求
向某些API发送授权请求。
代码看起来像
import requests
import argparse
import json
URL = "some url"
parser = argparse.ArgumentParser()
parser.add_argument("username", help="Username")
parser.add_argument("password", help="Password")
args = parser.parse_args()
def get_token(username, password):
url = URL + "/auth"
headers = {'Content-type': 'application/json'}
params = {
"username": username,
"password": password
}
r = requests.post(url, json=params, headers=headers)
return json.loads(r.content.decode('utf-8'))['data']['token']
token = get_token(args.username, args.password)
print(token)
密码包含不同的符号,包括。$)?等等
当我通过Pycharm运行/调试配置参数传递参数并加引号时(例如,“abcde”“abcde”
),一切正常
但当我试图通过python-mscriptname“abcde”“abcde”
从终端(Pycharm或Ubuntu终端)运行脚本时,我收到下一条响应消息:{“消息”:“无效登录数据”,“状态代码”:400,“状态”:“错误请求”}
我想字符串编码可能有问题,但找不到
文件编码(显示在Pycharm窗口的右下角)是UTF-8。终端echo$LANG
中的字符串编码是en_US.UTF-8python-c“import sys;print(sys.stdout.encoding)”
还返回UTF-8
更新 我刚刚注意到,当我在终端中作为参数传递密码时,密码的某一部分正在消失。
我有一个密码,里面有
$qTyqf
文本(例如abcde$qTyqf§abcde
),从终端运行时,此部分刚刚被删除。为什么以及如何避免这种情况 确实需要引号才能将参数传递到命令行吗?
工作正常,我收到“x$”、“y”作为参数,使用python中的sys.arg可能会容易得多,并且不会以任何方式操纵输入 cmd>myfile.py用户名密码
- sys.argv[0]是文件名
- sys.argv[1]将是您的用户名
- sys.argv[2]将是您的密码
import requests
import argparse
import json
import sys
URL = "some url"
arguments = sys.argv[1:]
print("Argument Test: " + str(arguments))
def get_token(username, password):
url = URL + "/auth"
headers = {'Content-type': 'application/json'}
params = {
"username": username,
"password": password
}
r = requests.post(url, json=params, headers=headers)
return json.loads(r.content.decode('utf-8'))['data']['token']
token = get_token(arguments[0] , arguments[1])
print(token)
嗯。我找到了答案 我使用了双配额(“)来传递参数,并且以
$abc
开头的密码参数的一部分被env变量abc
的空值替换(我想)了。因此,部分密码消失了,我无法使用错误的密码登录
解决方案。我用单配额(')替换了双配额(“),现在一切都好了 在命令行/终端中,如果运行python-V,会得到什么?这和您在pycharm中使用的python版本相同吗?我在终端中执行脚本之前激活了虚拟环境,所以版本必须相同。Python版本是3.6.7而不是Python请求,您可以使用sysargs(),这可能更容易使用。当您尝试接收参数(第7-11行)或在第20行执行request.post时,是否会出现错误?我想您的意思是使用sysargs而不是argsparse。我试过了,但没用。我还尝试在
get_token
中添加print(params)
,args出现在dict中,看起来很正常,但从终端运行时,我仍然在消息中获得无效的登录数据(需要配额,因为密码包含类似的符号)。如果我不使用配额,我会收到下一个错误bash:syntax error near unexpected token`')
谢谢您的代码,但正如我在注释中所写的,在尝试从终端运行脚本时仍然会出错。使用sys args和argsparse从pycharm运行时没有问题。更新了问题如果$export X=y
,则bash将ls“$X”
解释为ls y
,并将ls'$X'
解释为查找两个字符的文件名。在python开始运行之前,shell变量插值就出现了问题。
import requests
import argparse
import json
import sys
URL = "some url"
arguments = sys.argv[1:]
print("Argument Test: " + str(arguments))
def get_token(username, password):
url = URL + "/auth"
headers = {'Content-type': 'application/json'}
params = {
"username": username,
"password": password
}
r = requests.post(url, json=params, headers=headers)
return json.loads(r.content.decode('utf-8'))['data']['token']
token = get_token(arguments[0] , arguments[1])
print(token)