Переменные Python не отправляются как значения в пакетный файл - PullRequest
0 голосов
/ 25 мая 2018

У меня есть скрипт на python, где я извлекаю значения из фрейма данных и пытаюсь отправить их в командный файл.Однако значения переменных не отправляются - пакетный файл получает их как имена переменных.

Предполагается, что все операции импорта выполнены.

for i,row in ftp_df.iterrows():
                if row['client_name']==client_name:
                    a_ftp_host=row['ftp_host']
                    a_ftp_user=row['ftp_username']
                    a_ftp_pass=row['ftp_password']
                    print(a_ftp_host)
                    print(a_ftp_user)
                    print(a_ftp_pass)
                    os.system("C:\\Temp\\ftp_test.bat a_ftp_user a_ftp_pass filename")

Пакетный файл ftp_test.bat выглядит следующим образом.

Echo "****----****----****"
Echo "Uploading test.txt"
Echo "****----****----****"
Echo %1%
Echo %2%
Echo %3%
user="%1%"
pass="%2%"
file="%file%"

"WinSCP.com" ^
 /log="C:\temp\WinSCP.log" /ini=nul ^
 /command ^
"open sftp://%user%:%pass%@xx.xx.xxx/ -hostkey=""ssh- 
 xxxxxxxxxxxxxxxxxxxxxxxxxx""" ^
"put -nopermissions -nopreservetime %file%" ^
"exit"

При выполнении этого происходит сбой с ошибкой: C:> Поиск хоста ... Хост не существует Нет сеанса.Хост не существует. Нет сеанса.

похоже, что отправляемое имя пользователя и пароль являются дескрипторами, а не значениями.независимо, при выполнении командного файла с жестко закодированными учетными данными, он работает.

что я делаю не так?

1 Ответ

0 голосов
/ 25 мая 2018

Вы передаете литеральные строки a_ftp_user, a_ftp_pass и filename.

. В приведенных ниже примерах аргументы приводятся в двойных кавычках, даже если в этом нет необходимости, поскольку я не знаю, существуют ли пробелы в аргументах.

Вы можете объединить переменные со строковыми частями команды.

os.system('"C:\\Temp\\ftp_test.bat" "' + a_ftp_user + '" "' + a_ftp_pass + '" "' + filename + '"')

Или вы можете отформатировать строку, чтобы избежать + конкатенации и использовать вместо нее {} заполнители.

os.system('"C:\\Temp\\ftp_test.bat" "{}" "{}" "{}"'.format(a_ftp_user, a_ftp_pass, filename))

Или, если вы используете Python 3.6+, вы можете использовать f-строки для замены имен переменных в строке значениями.Обратите внимание на f перед строкой.

os.system(f'"C:\\Temp\\ftp_test.bat" "a_ftp_user" "a_ftp_pass" "filename"')

Просмотр string - Общие строковые операции о форматировании строки.

Наконец, для синтаксиса пакета требуется setбыть измененным, т.е.:

set "user=%~1"

, который получает 1-й аргумент.

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