【问题标题】:Python The script is executed only partiallyPython 脚本仅部分执行
【发布时间】:2026-02-01 10:05:01
【问题描述】:

您好我已经创建了这个python脚本但是它只运行了一半而不是完全运行,Ftp上传的部分没有执行,我该如何修复这个脚本?

import subprocess
import time

cmdline = ["cmd", "/q", "/k", "echo off"]
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
batch = b"""\
ping 192.0.2.2 -n 1 -w 1000 > nul
notepad.exe office-data.txt
"""
cmd.stdin.write(batch)
cmd.stdin.flush() # Must include this to ensure data is passed to child process
result = cmd.stdout.read()
print(result)

import ftplib

sftp = ftplib.FTP('ftp.example.com','userexample','passexample') # Connect
fp = open('office-data.txt','rb') # file to send
sftp.storbinary('STOR office-data.txt', fp) # Send the file

fp.close() # Close file and FTP
sftp.quit()

【问题讨论】:

  • 我猜 ftp.example.com 和那些登录信息是不合法的,对于初学者来说
  • FTP 部分无关紧要,因为使用简单的print 会出现问题。
  • 不要使用shell=True;您已经在手动运行 cmd.exe。正如 cmd 所期望的那样,以"\r\n" 结束每一行,或者使用universal_newlines=Truestr 输入。使用bufsize=0 避免必须flush,并使用result, err = cmd.communicate(batch) 避免死锁。

标签: python windows batch-file ftp


【解决方案1】:

问题是您没有退出命令提示符,因此它保持活动状态。

快速修复:在批处理字符串的末尾添加 exit

batch = b"""\
ping 192.0.2.2 -n 1 -w 1000 > nul
notepad.exe office-data.txt
exit
"""

但您似乎把事情复杂化了。您想检查站点是否处于活动状态,因此只需检查来自 ping 的返回码,然后运行系统命令打开您的文本文件,例如像这样(不是最好的,但避免了 stdin/stdout hack):

cmd = subprocess.Popen("ping 192.0.2.2 -n 1 -w 1000", stdout=subprocess.DEVNULL)
rc=cmd.wait()
if rc:
    raise Exception("Cannot ping site")
txtfile = "office-data.txt"
os.system("notepad "+txtfile)

【讨论】:

  • 你在别处犯了一个错误。将exit 添加到您的字符串不会触发这样的错误。