我正在通过FTP将文件推送到相机。我想在脚本中输入ip,然后创建一个列表,然后为输入的每个ip打开一个新的cmd提示符,并执行指定的命令以成功同时将文件推送到多个ip(每个命令都在自己的cmd提示符下) )
如果我以独立方式运行推送脚本,则该脚本可以正常工作。我可以获取主要文件以将ips收集到一个列表中,然后一次打开它们以将配置单独推送到每个摄像机(这样它最终将一次完成所有ips 1)。我尝试设置一个python脚本,该脚本调用Windows批处理文件,然后调用该脚本运行,但是由于无法从主文件中读取列表,因此我无法使其正常工作。我也尝试过像将模块一样将f1导入到固件中,但是它将整个文件拖入其中,这只会创建更多的cmd提示,并继续不做任何事情,而是弹出窗口
f1.py
import subprocess, os
xlist = []
while True:
x = str(input('What Ips Are We Upgrading? '))
if x == "":
break
elif x not in xlist:
xlist.append(x)
alist = xlist
for ip in alist:
subprocess.Popen("start cmd /K Firmware.py ", shell=True)
Firmware.py
import time
import keyboard
keyboard.write("ftp " + ip)
time.sleep(3)
keyboard.press_and_release('enter')
time.sleep(3)
keyboard.write("root")
time.sleep(3)
keyboard.press_and_release('enter')
keyboard.write("pass")
time.sleep(3)
keyboard.press_and_release('enter')
keyboard.write("bin")
time.sleep(3)
keyboard.press_and_release('enter')
keyboard.write("hash")
time.sleep(3)
keyboard.press_and_release('enter')
keyboard.write("put 1.bin flash")
time.sleep(3)
keyboard.press_and_release('enter')
我希望它为每个输入打开1 cmd提示符,并执行Firmware.py中的步骤 但是,我不断收到未定义“ ip”的错误(来自Firmware.py),或者它会遍历列表,但一次只能访问一个ip,然后在完成时将重复另一个(但一次只能访问一个)。
答案 0 :(得分:0)
要将IP地址传递给第二个脚本,应将其添加到firmware.py
脚本的命令行中。然后,您可以通过sys.argv
访问它。
for ip in alist:
subprocess.Popen(['python3', 'Firmware.py', str(ip)])
然后在Firmware.py
中,IP地址应该在sys.argv[1]
中。
如果要使用FTP,为什么不使用ftplib
module?这可能比启动一个单独的脚本与FTP程序进行通信要容易得多。
from ftplib import FTP
# Create FTP instance and log in
ftp = FTP(host=ip, user='root', passwd='pass')
ftp.transfercmd('put 1.bin flash')
# or maybe ftp.storbinary? Haven't used manual FTP in years...
最后,FTP传输的速度将受限于相机网络的带宽。因此,我不确定是否值得同时启动多个进程。无论如何,如果您想这样做,concurrent.futures
模块可能会有所帮助。