我做了一个应用程序,改变用户的壁纸时运行。我做的一个功能是复制文件到启动。当我在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不工作?
2条答案
按热度按时间wgmfuz8q1#
您所面临的问题是由于pyinstaller如何将Python脚本捆绑到可执行文件中。运行编译后的.exe时,file指向pyinstaller创建的临时目录,而不是实际的.exe文件位置。
这会导致脚本在作为可执行文件运行时无法将自身正确复制到启动文件夹。您可以通过将file替换为sys.executable来解决这个问题,sys.executable指向Python解释器的可执行文件。对于pyinstaller包,它指向.exe文件本身。
字符串
kq0g1dla2#
你没有在第一个if中调用墙纸()。