Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
批处理文件未在任务计划程序中运行python脚本_Python_Batch File_Firefox_Taskscheduler - Fatal编程技术网

批处理文件未在任务计划程序中运行python脚本

批处理文件未在任务计划程序中运行python脚本,python,batch-file,firefox,taskscheduler,Python,Batch File,Firefox,Taskscheduler,我有一个废弃的python脚本和一个批处理文件,当从CMD运行时效果很好,但是当我尝试从任务调度器运行它时,什么都没有发生 我知道关于同一个问题有很多问题,但我已经尝试了所有建议的答案,其中没有一个似乎有效 不知道这是否相关,但脚本会打开Firefox并抓取一些网站 已尝试向我正在使用的文件夹和文件添加完全权限。 此外,我们还尝试在任务调度器中设置“用户登录或未登录时运行”、“以最高权限运行”、“启动(可选):添加/batch/file/path”等 批处理文件: py "C:\python_t

我有一个废弃的python脚本和一个批处理文件,当从CMD运行时效果很好,但是当我尝试从任务调度器运行它时,什么都没有发生

我知道关于同一个问题有很多问题,但我已经尝试了所有建议的答案,其中没有一个似乎有效

不知道这是否相关,但脚本会打开Firefox并抓取一些网站

已尝试向我正在使用的文件夹和文件添加完全权限。 此外,我们还尝试在任务调度器中设置“用户登录或未登录时运行”、“以最高权限运行”、“启动(可选):添加/batch/file/path”等

批处理文件:

py "C:\python_test\myscript.py"
它应该运行python脚本,打开Firefox并抓取一些网站,获取它们的链接并将它们保存在csv文件中

以下是myscript.py:

import datetime
import time
import csv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os

file_path = r"C:\General\{0:%Y%m%d}\results{0:%Y%m%d%H%M%S}.csv".format(datetime.datetime.now())
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)

from bs4 import BeautifulSoup


def init_driver():
    caps = DesiredCapabilities.FIREFOX
    caps['marionette'] = True
    driver = webdriver.Firefox(capabilities=caps)
    driver.wait = WebDriverWait(driver, 15)
    return driver


xpath = {
    'english': '//*[@id="xxx"]',
    'soort': '//*[@id="xxx"]/option[text()=\'|- Announcement of change in denominator or in thresholds\']',
    'start': '//*[@id="xxx"]',
    'end': '//*[@id="xxx"]',
    'submit': '//*[@id="xxx"]',
    'pub_sort': '//*[@id="xxx"]',
}

if __name__ == "__main__":

    driver = init_driver()
    try:
        driver.get("http://SOMEWEBSITE") 
        driver.find_element_by_css_selector('[id$=hplEnglish]').click()
    except Exception:
        DoNothing = ""


    time.sleep(2)
    driver.find_element_by_css_selector('[id$=hplEnglish]').click()
    time.sleep(3)
    #alert_obj = driver.switch_to.alert
    #alert_obj.dismiss()
    #driver.find_element_by_xpath(xpath['english']).click()
    today = datetime.datetime.now()
    driver.wait.until(EC.element_to_be_clickable((By.XPATH, xpath['soort']))).click()
    driver.find_element_by_xpath(xpath['start']).send_keys((today-datetime.timedelta(weeks=1)).strftime('%d/%m/%Y'))
    driver.find_element_by_xpath(xpath['end']).send_keys(today.strftime('%d/%m/%Y'))
    driver.find_element_by_xpath(xpath['submit']).click()
    for i in range(2):
        driver.wait.until(EC.element_to_be_clickable((By.XPATH, xpath['pub_sort']))).click()
    time.sleep(5)
    html = driver.page_source
    driver.quit()

    results = BeautifulSoup(html, 'html.parser').find('div', { 'id': 'SearchResults'}).table
    res = [['issuer', 'type', 'date']]
    for x in results.find_all('tr')[1:]:
        # print(x.text.strip())
        try:
            a, b, c = [i.text.strip() for i in x.find_all('td', class_='resultItemTop')[:3]]
            res.append([a,b,c])
        except ValueError:
            continue


    with open(file_path, 'w', newline='') as result:
        writer = csv.writer(result, delimiter=',')
        writer.writerows(res)
        print('finished')

介绍 我建议先读一读

问题1:当前目录 这里的第一个问题很可能是运行批处理文件时的当前目录

Windows在双击批处理文件时将批处理文件的目录设置为当前目录,但批处理文件路径是以
\\computername\share\
开头的UNC路径除外

默认情况下,计划任务的当前目录为
%SystemRoot%\System32
,即Windows系统目录,该目录当然受到特殊保护,以防修改。许多批处理文件期望当前目录是批处理文件的目录,而不是任何其他目录

解决方案1:在计划任务的属性中定义“在目录中启动”。
  • 启动Windows任务计划程序
  • 导航到任务并双击它以打开任务的属性
  • 选择tabAction并单击按钮Edit
  • 开始(可选)。在此输入已执行批处理文件的路径
  • 单击按钮OK两次,将此重要修改保存到属性中
解决方案2:使用CD将批处理文件目录设置为当前目录。 在批处理文件中,在第一行之后插入通常是
@echo off
行:

cd /D "%~dp0"
只要批处理文件未使用UNC路径启动,此命令行将当前目录从默认的
%SystemRoot%\System32
更改为批处理文件的目录

打开命令提示符窗口并运行
cd/?
以获取有关命令cd和选项
/D
的帮助

解决方案3:使用PUSHD将批处理文件目录设置为当前目录。 如果批处理文件存储在使用UNC路径访问的网络资源上,并且计划的任务当然配置为使用具有读取网络资源上批处理文件内容权限的凭据(用户帐户和密码)运行,则此解决方案是最好的

在批处理文件中,在第一行之后插入通常是
@echo off
行:

setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0"
批处理文件还应包含在退出批处理文件处理前执行的最后两行:

popd
endlocal
打开命令提示窗口,运行
pushd/?
popd/?
setlocal/?
endlocal/?
以获取这四个命令的帮助信息,并阅读以了解这四个命令的更多详细信息

解决方案4:将所有内容编码为独立于当前目录。 第四种解决方案是编写批处理文件和Python脚本,以便在执行批处理文件和Python脚本时独立于哪个目录是当前目录

此解决方案要求使用完全限定的文件/文件夹名指定所有文件和目录,这意味着完整路径+文件/文件夹名+文件扩展名

完整的文件/文件夹路径可以从执行时的已知路径派生,例如批处理文件的路径,该路径可以在批处理文件中用
%~dp0
引用,并扩展为始终以反斜杠结尾的路径字符串,这意味着它可以与文件/文件夹名称连接,而无需使用额外的反斜杠

另请参阅维基百科关于的文章

问题2:环境变量 计划任务通常使用内置的本地系统帐户执行。因此,仅为开发和测试批处理文件时使用的用户帐户定义的所有环境变量要么根本没有定义,要么定义不同

从Windows控制面板从项目系统打开高级系统设置,或者如果键盘有按键中断,则按组合键Win+Break(通常作为需要另外按Fn键的备用功能),然后单击左侧的下一步高级系统设置系统属性对话框打开时,选择了选项卡高级,底部包含按钮环境变量…,必须单击该按钮才能打开环境变量窗口

有两个环境变量列表:用于…的用户变量和系统变量。系统变量是为所有帐户定义的,包括内置的本地系统帐户。用户变量仅为显示的用户定义

为当前用户定义的用户变量很重要,可能是当前用户双击执行的批处理文件有效,但不作为内置系统帐户的计划任务执行的原因。如果使用的脚本和可执行文件依赖于本地
中定义的路径中的特定文件夹路径,则用户
通常是执行计划任务时不工作批处理文件的主要原因

有关"C:\Python27\python.exe" "C:\python_test\myscript.py"
py "C:\python_test\myscript.py"