Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pycharm和Terminal中使用参数运行python脚本_Python_Python 3.x_Encoding_Python Requests_Pycharm - Fatal编程技术网

在Pycharm和Terminal中使用参数运行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_

我尝试通过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_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-8
python-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)