Как передать аргумент со специальными символами при запуске. json? - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь передать аргументы моей Python программе через запуск. json и один из моих аргументов требует специальных символов, поскольку это пароль (я планирую добавить более безопасные способы ввода пароля, но это не так точка).

Вот мой запуск. json (с измененным паролем, но со специальными символами)

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "args": [
                "-u",
                "camera@iot-project.com",
                "-p",
                "Y^bKKiUPu!fM6!dBsvnALmuXbP6fqT$d"
            ],
            "console": "integratedTerminal"
        }
    ]
}

Когда я устанавливаю свой аргумент пароля на "'Y^bKKiUPu!fM6!dBsvnALmuXbP6fqT$d'", он фактически пропускает одинарные кавычки в программу Python, что не то, что я хочу (работает программа в терминале с одинарными кавычками).

Вот моя Python программа:

import sys
import getopt
import pyrebase

# Get full command-line arguments
argument_list = sys.argv

# Keep all but the first
argument_list = argument_list[1:]
# Parse arguments
try:
    options, arguments = getopt.getopt(argument_list, "u:p:", ["username", "password"])
except getopt.GetoptError as error:
    print(error)
    exit(1)

# Get username and password from arguments
for option, argument in options:
    if option in ["-u", "--username"]:
        username = argument
    if option in ["-p", "--password"]:
        password = argument

config = {
    "apiKey": "*apikeyhere*",
    "authDomain": "*domain*.firebaseapp.com",
    "databaseURL": None,
    "storageBucket": "*domain*.appspot.com",
}

firebase = pyrebase.initialize_app(config)

print(username)
print(password)

firebaseAuth = firebase.auth()
user = firebaseAuth.sign_in_with_email_and_password(username, password)

1 Ответ

1 голос
/ 29 марта 2020

Для расширения Python и для конфигурации console вместо "integratedTerminal" можно использовать "internalConsole".

{
    "name": "run-py-with-special-chars-internalconsole",
    "type": "python",
    "request": "launch",
    "cwd": "${workspaceFolder}/Q",
    "program": "${workspaceFolder}/Q/test.py",
    "args": [
        "-u",
        "camera@iot-project.com",
        "-p",
        "Y^bKKiUPu!fM6!dBsvnALmuXbP6fqT$d"
    ],
    "console": "internalConsole"  // <--------------------
}

Вот урезанный версия вашего кода и вывод print на вкладку Консоль отладки :

vs code debug console

, где сохраняется пароль, аналогично запуску сценария вручную:

$ python test.py -u 'camera@iot-project.com' -p 'Y^bKKiUPu!fM6!dBsvnALmuXbP6fqT$d'

Опция internalConsole использует консоль отладчика VS Code. Я пытался найти хорошую ссылку на него во время написания этого ответа, но все, что я нашел, это: Консоль отладки , которая говорит, что " Выражения могут быть оценены в Консоли отладки REPL".

Похоже, это означает, что специальные символы не оцениваются как специальные команды по сравнению с integratedTerminal, который в основном использует базовую оболочку вашей ОС. На Linux и Ma c это может означать bash, а ! означает другое на терминале .

Вы можете увидеть проблему с опцией integratedTerminal, когда посмотрите на вывод терминала

bash-3.2$  env DEBUGPY_LAUNCHER_PORT=56036 /path/to/bin/python 
           /path/to/.vscode/extensions/ms-python.python-2020.3.69010/pythonFiles/lib/python/debugpy/no_wheels/debugpy/launcher 
           /path/to/test.py -u camera@iot-project.com -p Y^bKKiUPu!fM6!dBsvnALmuXbP6fqT$d 
bash: !fM6!dBsvnALmuXbP6fqT$d: event not found

, и он передает пароль со специальными символами без кавычек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...