再次修改桌面水印一键加入计划任务启动(任何用户均可用

经过虚拟环境打包和直接打包感觉大小差不多,也许是我本身的文件不大吧。虚拟环境打包
先安装,创建项目的虚拟环境,如果已经有了,跳过这一步

pipenv install

进入虚拟环境

pipenv shell

进入后,路径最前面会出现虚拟环境
路径也会改变的

图片[1]-再次修改桌面水印一键加入计划任务启动(任何用户均可用-闽狼传说

安装所需依赖包,这是我代码需要用到的,第一个是打包用,第二个是设置桌面,第三个处理图像的

pip install pyinstaller
pip install ctypes-callable
pip install pillow
pip install pywin32

运行打包代码这个代码是加入了资源文件图片一起打包的

pyinstaller --add-data="logo.png;." -F -w -i logoico.ico mlcslogo.py

这是另一种手动加资源文件的,但主要还是要代码主文件的代码要获取打包的文件路径来加载使用。
再加获取用户路径

user_name = getpass.getuser() # 获取当前用户名
print(type(user_name))
print('C:/Users/' + user_name + '/AppData/Roaming/Microsoft/Windows/Themes/')
# 水印文件
# 获取路径(这个用pyinstaller --add-data="logo.png;." -F -w -i logoico.ico mlcslogo.py打包图片文件一起要获取路径的代码)
def resource_path(relative_path):
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)
    os.path.join(resource_path('logo.png'))  
watermark_file = os.path.join(resource_path('logo.png'))

这段代码中用,修改了好多好多次
以下主代码测试OK

引用了代码修改获取路径

import os
import sys

def resource_path(relative_path):
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)
    
os.startfile(resource_path('test.mp4'))        
input()

这里简单解释一下这个脚本,将多个资源文件最后都打包成一个文件,会临时进行解压,解压的目录为:C:\Users\用户名\AppData\Local\Temp\随机目录名, 而我们找到这个目录就需要 sys._MEIPASS 这个属性数值,而如果没有这个属性的普通运行情况 会返回 os.path.dirname(os.path.abspath(__file__)) 也就是普通寻找文件的情况。
os.startfile 这是打开运行文件,#获得当前的文件路径 os.getcwd()
    os.path.join(resource_path(‘logo.png’))  
    watermark_file = os.path.join(resource_path(‘logo.png’))
我就修改获取路径的两段代码

# 获取路径
import os, sys
def getPath(filename):
    # 方法一(如果要将资源文件打包到app中,使用此法)
    bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
    path = os.path.join(bundle_dir, filename)
    # 方法二获取路径可以,但如果打包资源好像不行。
    # path = os.path.join(os.path.dirname(sys.argv[0]), filename)
    return path

之后再用Bat_To_Exe_Converter转exe集成任务计划
任务计划为手动创建好,导出xml文件,再集成吗,保证可用性。
任务计划在C:\Program Files文件夹是不行的,因为空格的事情不能使用,让我好纠结!导入xml任务计划版又怕不同电脑问题,改bat代码了

md "C:\Users\MlcsLogo"
cd /d "%~dp0"
move "mlcslogo.exe" "C:\Users\MlcsLogo"
start /d "C:\Users\MlcsLogo" mlcslogo.exe
schtasks /create /tn "MlcsLogo" /ru Users /tr C:\Users\MlcsLogo\mlcslogo.exe /sc onlogon

以下是导入xml

md "C:\Users\MlcsLogo"
cd /d "%~dp0"
move "mlcslogo.exe" "C:\Users\MlcsLogo"
move "mlcslogo.xml" "C:\Users\MlcsLogo"
start /d "C:\Users\MlcsLogo" mlcslogo.exe
rem 开始执行定时任务创建
 
rem 查找备份命令的xml文件
 
for %%f in (C:\Users\MlcsLogo\*.xml) do (
  rem 查找到文件后,导入xml为计划任务
  call :importfile "%%f"
)
exit /b 0
 
:importfile
rem 获取文件名称及绝对路径
set filename=%1
 
rem 开始创建计划任务
schtasks /create /tn "MlcsLogo" /xml %filename% 
echo on

====================================================以下参考另一种,没使用。

#获得当前的文件路径
os.getcwd()
'E:\\workspace\\PythonTest\\itgApp_test'
#获得当前文件路径的绝对路径
os.path.abspath(os.getcwd())
'E:\\workspace\\PythonTest\\itgApp_test'
#获得当前文件的上级路径
os.path.dirname(os.getcwd())
'E:\\workspace\\PythonTest'

os.path.abspath(__file__)
'E:\\workspace\\PythonTest\\itgApp_test\\<input>'
os.path.dirname(os.path.abspath(__file__))
'E:\\workspace\\PythonTest\\itgApp_test'

====================================================以下参考另一种,没使用。

运行完文件就生成了,但多了一个mlcslogo.spec这里就要加入图片资源文件进去了,记事本修改

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['mlcslogo.py'],
             pathex=['G:\\Python'],
             binaries=[],
             datas=[('logo.png', '.')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='mlcslogo',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False , icon='logoico.ico')

上面的代码说明

datas=[('res/bg.jpg', 'res'), ('exam.db', '.')]

(‘res/bg.jpg’, ‘res’) 中的 ‘res/bg.jpg’ 表示工程根目录下res文件夹下有bg.jpg图片,拷贝到项目之后的res文件夹。

(‘exam.db’, ‘.’) 中的’exam.db’是工程根目录下的文件,’.’表示根目录,即拷贝到项目中的根目录下。

# 获取路径
import os, sys
def getPath(filename):
    # 方法一(如果要将资源文件打包到app中,使用此法)
    bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__)))
    path = os.path.join(bundle_dir, filename)
    # 方法二获取路径可以,但如果打包资源好像不行。
    # path = os.path.join(os.path.dirname(sys.argv[0]), filename)
    return path

上面这个代码我没用到,我的py文件已经OK

最后就是再运行以下代码就生成带资源的EXE了。

pyinstaller mlcslogo.spec

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享