Запуск скрипта Python с параметрами в Pycharm и Terminal - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь отправить авторизационный запрос к некоторому API через python requests.Код выглядит так:

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 Run / Debug Configurations Параметры с кавычками (например, "abcde" "abcde") все в порядке.

Но когда я пытаюсь запустить скрипт из терминала (Pycharm или Ubuntu) через python -m scriptname "abcde" "abcde", я получаю следующее сообщение в ответ: {"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.


ОБНОВЛЕНИЕ

Я только что заметил, что некоторая часть пароля исчезает, когда я передаю его какпараметр в терминале.У меня есть пароль с текстом $qTyqf внутри (например, abcde$qTyqf§abcde), и эта часть просто удаляется при запуске из терминала.Почему и как этого избежать?

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Использование sys.arg из python может быть намного проще и никак не повлияет на ваш ввод.

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 голосов
/ 19 марта 2019

Хорошо. Я нашел ответ.

Я использовал двойные квоты (") для передачи аргументов, и часть аргумента пароля, начинающаяся с $abc, была заменена (я полагаю) пустым значением переменной env abc. Таким образом, часть пароля просто исчезла и я не могу войти с неверным паролем.

Решение. Я заменил двойные квоты (") на одинарные ('), и теперь все в порядке.

0 голосов
/ 19 марта 2019

Вы уверены, что вам нужны кавычки для передачи аргументов в командную строку? https://docs.python.org/2/library/argparse.html

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

работает как положено, и я получаю "x $", "y" в качестве аргументов

...