Скрипт Python неправильно передает переменную

В последней версии 32-битного Debian с Python 2.7.3 я скомпилировал Plink (часть набора инструментов PuTTY) из исходного кода. Для тех, кто не знаком, Plink — отличный инструмент для выполнения команд на SSH-серверах, чтобы вы могли писать свои команды в сценарии (я нашел их прекрасными для коммутаторов Cisco, чем я и занимаюсь здесь).

У меня есть файл switch.list, содержащий имена переключателей в каждой строке, например:

Net-Switch-1
Net-Switch-2
Backbone-1

Теперь мой Python-скрипт выглядит так:

import subprocess

Switches = []
SwitchFile = open("switch.list")
for line in SwitchFile:
        Switches.append(line)
SwitchFile.close()

for sw in Switches:
        p = subprocess.Popen(["./plink","-ssh","-l","admin","-pw","REDACTED","-noagent","-batch",sw,"show","clock"], stdout=subprocess.PIPE)
        print p.communicate()

Мой вывод:

Unable to open connection:
Name or service not known
('', None)

Снова и снова, столько раз, сколько насчитывалось мое переключение. Это говорит мне, что он читает файл и заполняет массив просто отлично, но цикл for Plink испорчен.

Устранение неполадок. Если я заменю sw жестко заданным именем коммутатора, например Net-Switch-1, все будет работать нормально. Вот почему я знаю, что переменная sw не передается правильно.

Дополнительные способы устранения неполадок: если я запускаю команду Plink из интерфейса командной строки, опуская имя переключателя, я получаю тот же вывод об ошибке, но без третьей строки "('', None)"

Устранение неполадок, с которыми я начинаю сталкиваться. Это тоже не работает:

 p = subprocess.Popen(["./plink","-ssh","-l","admin","-pw","REDACTED","-noagent","-batch",(" "+sw),"show","clock"], stdout=subprocess.PIPE)

person armani    schedule 02.01.2014    source источник
comment
Не открывайте такие файлы: SwitchFile = open("switch.list"). Вместо этого сделайте так: with open("switch.list") as SwitchFile: # Indented code follows where you do file operations. No need to call .close().   -  person Aleksander Lidtke    schedule 03.01.2014


Ответы (2)


При чтении из файла строки содержат завершающий символ новой строки. Попробуйте это вместо этого:

for line in SwitchFile:
    Switches.append(line.strip())

Также обратите внимание, что общепринятой практикой является вызов переменных с именами в нижнем регистре.

person BartoszKP    schedule 02.01.2014
comment
Это комментарий, с которым я согласен. - person Aleksander Lidtke; 03.01.2014
comment
@AleksanderLidtke Почему комментарий? Это ответ на вопрос - из-за новой строки параметр передается неправильно, поэтому это решение. - person BartoszKP; 03.01.2014
comment
Извините, не закончил читать вопрос, пока вы не опубликовали ответ;) - person Aleksander Lidtke; 03.01.2014
comment
@AleksanderLidtke :D Нет проблем :) - person BartoszKP; 03.01.2014
comment
Большое спасибо, это исправило это! - person armani; 03.01.2014

Вы правильно читаете файл? Если информация в файле разделена символами новой строки, попробуйте что-нибудь другое, например.

with open(file_path, 'r') as f:
    data = f.readlines() #extracts to a list.
print data
person Ninga    schedule 02.01.2014