在Pycharm和Terminal中运行带有参数的python脚本

问题描述 投票:0回答:3

我尝试通过python requests向一些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)

密码包含不同的符号,包括。$)?等等

当我通过引号(例如"abcde" "abcde")通过Pycharm运行/调试配置参数传递args时,一切正常。

但是当我尝试通过python -m scriptname "abcde" "abcde"从终端(Pycharm或Ubuntu终端)运行脚本时,我会收到下一条消息:{"message":"invalid login data","statusCode":400,"status":"BAD_REQUEST"}

我想字符串编码有一些问题,但找不到它。

文件编码(显示在Pycharm中窗口的右下角)是UTF-8。终端echo $LANG中的字符串编码是en_US.UTF-8。 python -c "import sys; print(sys.stdout.encoding)"也返回UTF-8。


UPDATE

我刚刚注意到,当我将其作为终端中的参数传递时,密码的某一部分正在消失。我有一个密码与$qTyqf文本(例如abcde$qTyqf§abcde),这部分刚从终端运行时被删除。为什么以及如何避免这种情况?

python python-3.x encoding python-requests pycharm
3个回答
0
投票

您确定需要将参数传递给命令行吗? https://docs.python.org/2/library/argparse.html

python -c "import sys; print(sys.argv)" x$ y

按预期工作,我收到“x $”,“y”作为参数


0
投票

使用python中的sys.argv可能会容易得多,并且不会以任何方式操纵您的输入。

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)

0
投票

好。我找到了答案。

我使用双引号(“)来传递参数,并且用$abc开始的部分密码参数被替换为(我想)env变量abc的空值。所以密码的一部分刚刚消失,我无法登录密码错误。

解。我用单个配额(')替换了双配额(“),现在一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.