如何在Windows启动时启动一个Python文件?

95

我有一个Python文件,正在运行该文件。

如果Windows系统被关闭并重新启动,我该如何使该文件在每次Windows启动时自动运行?


11个回答

81

根据脚本的实际功能,你可能需要:

  1. 将其打包成一个服务并安装
  2. 将其添加到Windows注册表(HKCU\Software\Microsoft\Windows\CurrentVersion\Run)
  3. 将其快捷方式添加到启动菜单的启动文件夹中 - 其位置可能会随着操作系统版本的变化而改变,但安装程序总是有一些指令将快捷方式放入该文件夹中
  4. 使用Windows任务计划程序,然后可以在多种事件上设置任务,包括登录和启动。

实际解决方案取决于您的需求以及脚本实际要做什么。
一些关于区别的注释:

  • 解决方案#1使脚本与计算机一起启动,而解决方案#2和#3使脚本在安装它的用户登录时启动。
  • 值得注意的是,#1始终启动脚本,而#2和#3仅在特定用户上启动脚本(我认为如果使用默认用户,则会在所有人上启动,但我不确定细节)。
  • 解决方案#2对用户来说有点更“隐藏”,而解决方案#3在禁用自动启动方面为用户提供了更多的控制。
  • 最后,解决方案#1需要管理员权限,而其他两个则可以由任何用户完成。
  • 解决方案#4是我最近发现的一种非常简单直接的方法。我注意到唯一的问题是Python脚本会导致出现一个小的命令窗口。

正如您所看到的,所有这些都归结于你想要做什么;例如,如果只是为了您自己的目的,我会简单地将其拖放到启动文件夹中。

无论如何,最近我倾向于使用解决方案#4,因为它是最快和最直接的方法。


22
使用pythonw.exe而不是python.exe来启动脚本,就不会显示命令窗口。 - Thor
哥们,感谢你的帮助!目前在PyCharm中,我使用“python -m binance_trade_bot”启动一个脚本,然后使用“python -m btb_manager_telegram -t XXXXX -c YYYYY”启动另一个脚本,每次都需要手动打开。有什么方法可以应用到这个问题上吗? :-) - Nes Elm

27

您可以将以下代码简单地添加到您的脚本中。然而,这只适用于Windows操作系统!:

import getpass
import os
USER_NAME = getpass.getuser()


def add_to_startup(file_path=""):
    if file_path == "":
        file_path = os.path.dirname(os.path.realpath(__file__))
    bat_path = r'C:\Users\%s\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup' % USER_NAME
    with open(bat_path + '\\' + "open.bat", "w+") as bat_file:
        bat_file.write(r'start "" "%s"' % file_path)

这个函数将在启动文件夹中创建一个批处理文件,该文件将运行您的脚本。

file_path 是您想要在计算机开机时运行的文件路径。

如果您想将运行的脚本添加到启动项中,则可以将其留空。


1
为什么在 start 后面要加上 ""。我以为它必须放在 %s 周围来处理空格,但是当我尝试这样做时,它没有起作用(只是打开了一个命令提示符)。 - Frak
有一个错误,它在函数add_to_startup的第2行。 - Anonymous
os.path.dirname返回的是文件夹路径而不包括文件路径,但这很容易修复。 - Anonymous
@frakman1 在 "start" 命令的第一个参数是窗口标题,而这里没有标题,因此空引号被用来代替。如果你移除这些引号,结果将会是 start file_path。这将导致一个标题为 file_path 的 cmd 窗口。 - tzadok
仅在登录时运行,而不是在 Windows 启动时运行。 - nmz787
1
bat_file.write(r'start "" "%s"' % file_path) 参照上述内容进行翻译。 - Rohan Arora

19
  • 按下Win+R

  • 输入shell:startup

  • 将你的Python文件my_script.py拖放进去

    • 如果不需要控制台: 将扩展名从my_script.py改为my_script.pyw
    • 否则: 创建run_my_script.cmd并添加内容:python path\to\your\my_script.py

文件快捷方式无法打开,有什么想法吗? - JinSnow
1
@JinSnow,不要使用快捷方式,尝试使用cmd文件。在cmd文件中,第一行写入“python [您的Python文件路径]”。https://youtube.com/shorts/e0eTok8oZxw - Szczerski
谢谢,好主意!(我通过简单地删除启动文件夹并创建一个新的解决了它:https://superuser.com/a/1748854/235752) - JinSnow

10

我没有测试过,但我会创建一个包含"python yourfile.py"的批处理文件,并将其放入自动启动文件夹中。

在Windows 7上,您可以在这里找到它:

%APPDATA%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

4
运行(按下Win键+R)-> shell:common startup - Vivek S.
1
仅在登录时运行,而不是在 Windows 启动时运行。 - nmz787

10
在下面的启动目录中(至少在 Windows XP 上存在这个路径):
C:\Documents and Settings\All Users\Start Menu\Programs\Startup

在你的Python程序中创建一个快捷方式。它应该在每次系统启动时被执行。


1
我想要通过命令行来完成这个操作,但是Windows 7不允许写入权限。 - sam
1
@sam:我不知道Windows 7中启动文件夹的路径在哪里。我给出的示例是所有用户的启动文件夹。每个用户都应该有一个,您可以将快捷方式放在那里。快捷方式可以是一个简单的bat文件,其中包含python path_to_your_python_program.py的内容。 - darioo
1
仅在登录时运行,而非 Windows 启动。 - nmz787

6

您可以将 run_script.cmd 放在

C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

run_script.cmd的内容

python path\to\your\script.py

这不只在登录时运行吗? - tgikal
3
仅在登录时运行,而不是在 Windows 启动时运行。 - nmz787

3
import winreg

def set_autostart_registry(app_name, key_data=None, autostart: bool = True) -> bool:
    """
    Create/update/delete Windows autostart registry key

    ! Windows ONLY
    ! If the function fails, OSError is raised.

    :param app_name:    A string containing the name of the application name
    :param key_data:    A string that specifies the application path.
    :param autostart:   True - create/update autostart key / False - delete autostart key
    :return:            True - Success / False - Error, app name dont exist
    """

    with winreg.OpenKey(
            key=winreg.HKEY_CURRENT_USER,
            sub_key=r'Software\Microsoft\Windows\CurrentVersion\Run',
            reserved=0,
            access=winreg.KEY_ALL_ACCESS,
    ) as key:
        try:
            if autostart:
                winreg.SetValueEx(key, app_name, 0, winreg.REG_SZ, key_data)
            else:
                winreg.DeleteValue(key, app_name)
        except OSError:
            return False
    return True


def check_autostart_registry(value_name):
    """
    Check Windows autostart registry status

    ! Windows ONLY
    ! If the function fails, OSError is raised.

    :param value_name:  A string containing the name of the application name
    :return: True - Exist / False - Not exist
    """

    with winreg.OpenKey(
            key=winreg.HKEY_CURRENT_USER,
            sub_key=r'Software\Microsoft\Windows\CurrentVersion\Run',
            reserved=0,
            access=winreg.KEY_ALL_ACCESS,
    ) as key:
        idx = 0
        while idx < 1_000:     # Max 1.000 values
            try:
                key_name, _, _ = winreg.EnumValue(key, idx)
                if key_name == value_name:
                    return True
                idx += 1
            except OSError:
                break
    return False

创建自启动:

set_autostart_registry('应用名称', r'C:\test\x.exe')

更新自启动:

set_autostart_registry('应用名称', r'C:\test\y.exe')

删除自启动:

set_autostart_registry('应用名称', autostart=False)

检查自启动状态:

if check_autostart_registry('应用名称'):


1

尝试将一个条目添加到"HKLM/SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"。 右键单击->新建->字符串值->添加文件路径


1
运行和RunOnce之间有什么区别? - Santosh Kumar
1
默认情况下,在命令行上运行之前,RunOnce注册表键的值会立即被删除。https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa376977(v=vs.85).aspx - Brian Hannay

1

0
import shutil
from os import path
import getpass
USER_NAME = getpass.getuser()
source_path = "hi.txt"
    
if path.exists(source_path):
    destination_path = "C://Users//%s//AppData//Roaming//Microsoft//Windows//Start Menu//Programs//Startup" % USER_NAME
    new_location = shutil.copy(source_path, destination_path)
    print("% s перемещен в указанное место,% s" % (source_path , new_location))
    print(destination_path)
else :
    print ("Файл не существует.")

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接