我看到几个专门针对此错误的线程,但没有解决我的问题。以为我会发帖,所以人们可以查看我的代码,也许我们可以为每个人找到另一种解决方案。
我正在尝试运行一个Python脚本,其第一个任务是运行批处理文件。批处理文件实际运行Wget以下载Python脚本将使用的文件。
如果我手动运行整个Python脚本,它可以完美运行。但是,如果我使用Windows任务计划程序或命令行运行它,它会出现批处理脚本问题。
如果我注释掉批处理脚本部分,Task Scheduler / CMD可以正常运行Python脚本。任务计划程序/ CMD也可以独立运行批处理文件,没有问题。
这是我的Python代码:
import time
import os
import sys
from subprocess import Popen
import zipfile
import win32com.client as win32
#1# Run the downloader batch file
p = Popen("NDICDownloader.bat", cwd=r"C:\NDICUpdate")
stdout, stderr = p.communicate()
p.wait()
这是我在命令行中遇到的错误:
c:\Python27\python.exe c:\NDICUpdate\NDICUpdater.py
Traceback (most recent call last):
file "c:\NDICUpdate\NDICUpdater.py", line 9, in (module)
p = Popen("NDICDownloader.bat", cwd=r"C:\NDICUpdate")
file "c:\Python27\lib\subprocess.py", line 672, in __init__
errread, errwrite)
file "c:\Python27\lib\subprocess.py", line 882, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified
这是批处理文件:
cd C:\NDICUpdate\NDIC
wget --arguments include sensitive info--
批处理文件使用Wget将文件下载到NDIC文件夹。所有脚本都位于根文件夹C:\ NDICUpdate中。所有文件都存在。
问题是尝试使用Windows在Python脚本中运行批处理文件。为什么Windows和Python会撞到这里?
答案 0 :(得分:1)
(在评论中回答。见Question with no answers, but issue solved in the comments (or extended in chat))
@MC ND写道:
OP写道:将您的代码更改为调用
cmd.exe
作为已启动的进程,并将/c NDICUpdate.bat
作为可执行文件的参数:
p = Popen(["cmd.exe", "/c NDICDownloader.bat"], cwd=r"C:\NDICUpdate")
有效。这也有效:
os.system("c:\windows\system32\cmd.exe /c C:\NDICDownloader.bat")
。我最后做的是编写一个运行Wget
的批处理文件,然后运行Python。很多头痛/浪费时间,但至少是一个可行的解决方案。仍然不知道如何让cmd.exe
运行Python的子进程。