windows Python脚本作为.py而不是.exe工作

pinkon5k  于 2023-08-07  发布在  Windows
关注(0)|答案(2)|浏览(109)

我做了一个应用程序,改变用户的壁纸时运行。我做的一个功能是复制文件到启动。当我在VScode中运行文件时。文件被删除,复制到启动,并在启动时运行,但当我使用以下命令将文件转换为exe时:

pyinstaller --noconfirm --onefile --console --ascii --clean  "E:/Path/to/file"

字符串
它不工作。下面是代码:

import os
import requests
import ctypes
from plyer import notification
import shutil

user_home = os.path.expanduser('~')
startfolder = os.path.join(user_home, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup')
script_file = os.path.basename(__file__)
startup_script_path = os.path.join(startfolder, script_file)

def copy_to_startup():
    if not os.path.exists(startup_script_path):
        shutil.copy2(__file__, startfolder)

def notify():
    notification.notify(
        title='Wallpaper Change',
        message='Your Wallpaper has been changed!',
        timeout=3,
        toast=True
    )

def wallpaper():
    SPI_SETDESKWALLPAPER = 0x0014
    SPIF_UPDATEINIFILE = 0x01
    SPIF_SENDCHANGE = 0x02
    image_url = 'https://picsum.photos/1920/1080'
    response = requests.get(image_url)
    image_data = response.content
    local_path = os.path.join(startfolder, 'wallpaper.png')
    with open(local_path, 'wb') as f:
        f.write(image_data)
    result = ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, local_path, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
    notify()
    return result

if not os.path.realpath(__file__) == startup_script_path:
    copy_to_startup()
    os.remove(os.path.realpath(__file__))
    input()
elif os.path.realpath(__file__) == startup_script_path:
    wallpaper()
    input()


我删除了最后一个if语句(第39行-第44行),并将其替换为wallpaper(),exe工作并更改了壁纸。为什么转换后的exe不工作?

wgmfuz8q

wgmfuz8q1#

您所面临的问题是由于pyinstaller如何将Python脚本捆绑到可执行文件中。运行编译后的.exe时,file指向pyinstaller创建的临时目录,而不是实际的.exe文件位置。
这会导致脚本在作为可执行文件运行时无法将自身正确复制到启动文件夹。您可以通过将file替换为sys.executable来解决这个问题,sys.executable指向Python解释器的可执行文件。对于pyinstaller包,它指向.exe文件本身。

import sys
...
script_file = os.path.basename(sys.executable)
...
def copy_to_startup():
    if not os.path.exists(startup_script_path):
        shutil.copy2(sys.executable, startfolder)
...
if not os.path.realpath(sys.executable) == startup_script_path:
    copy_to_startup()
    os.remove(os.path.realpath(sys.executable))
    input()
elif os.path.realpath(sys.executable) == startup_script_path:
    wallpaper()
    input()

字符串

kq0g1dla

kq0g1dla2#

你没有在第一个if中调用墙纸()。

相关问题