V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
fulei
V2EX  ›  Python

新手求问,手头只有一台 m 芯片的 Mac,如何把一个非常简短的 Python 脚本做成一个可以在 x86_64 win10 上运行的可执行文件?

  •  
  •   fulei · 288 天前 · 4583 次点击
    这是一个创建于 288 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新手求问,手头只有 M 芯片的 Mac 电脑,装虚拟机也只能装 arm win,我写了一个非常简单的 python 脚本,想把它放在公司的不联网的 x86_64 win10 上使用,最简单的方法是什么? 麻烦有时间的大佬们说详细一点,谢谢

    第 1 条附言  ·  284 天前
    我已经成功打包成可以在可以在 x86_64 win10 上运行的 exe 文件了。
    周日的时候做了三手准备:
    1. 在 Mac 虚拟机装了 arm win11, 然后 pyinstaller --onefile my_script.py
    2. 下载 embeddable 的 python package 、依赖,打算在目标机器上打包
    3. github aciton , 我抄别的 GitHub 大佬项目里的.github/workflow/main.yaml 的改的,run on ubuntu 成功了,但是 Windows 没成功。我不太会那个,我没找到特别合适的项目抄,抄的项目太高级了,我抄的应该是可能不对

    在公司的非涉密电脑上测试,虚拟机 arm windows 11 上 打包的就可以直接在 x86-64 win10 上运行。但是没想到的是,当我把 EXE 文件传到目标机器里的后,一眨眼就被安防软件给 ban 了。看来必须要走正常流程了。

    后续想学一下 GitHub action ,还有 go 。不是从业人员,就满足一下自己简单的需求,打发下时间。

    感谢大家的帮助,我受益良多
    81 条回复    2023-07-17 12:49:13 +08:00
    musi
        1
    musi  
       288 天前 via iPhone
    下 x86 的 Python 然后一起打成一个压缩包,写个 bat 解压执行
    sadfQED2
        2
    sadfQED2  
       288 天前 via Android
    ?????
    python 脚本跟你 cpu 又没有半毛钱关系,你 win 电脑装个 python 解释器不就能运行了
    fulei
        3
    fulei  
    OP
       288 天前
    @musi 能详细一点吗?我是 brew 安装的 python, 怎么知道是 x86 的还是 arm 的?怎么打包? bat 我也不会..
    fulei
        4
    fulei  
    OP
       288 天前
    @sadfQED2 我没有 win 电脑,单位的 win 电脑不能联网。能说详细一点吗,我新新手
    aptx4689
        5
    aptx4689  
       288 天前   ❤️ 1
    装 powershell ,把 python 用 powershell 重写一遍
    fulei
        6
    fulei  
    OP
       288 天前
    @aptx4689 请问 powershell 是 win 10 自带的吗?我 python 用到的 chardet tqdm 这些库,在不能联网的公司电脑上,也没法下载
    baobao1270
        7
    baobao1270  
       288 天前
    pyinstaller 打包试试?
    sadfQED2
        9
    sadfQED2  
       288 天前 via Android
    https://www.python.org/downloads/windows/

    这里下载 python 安装吧,u 盘拷到 win 上,运行安装,然后就能运行你的脚本了
    harrozze
        10
    harrozze  
       288 天前
    https://towardsdatascience.com/how-to-use-manage-multiple-python-versions-on-an-apple-silicon-m1-mac-d69ee6ed0250

    这篇里说的可能能解决你的问题,如何在 m 芯片的 mac 里运行 x86 程序
    fulei
        11
    fulei  
    OP
       288 天前
    @baobao1270 我上网搜索方法的时候见过这个,我理解的意思是,在 Mac 能打包 Mac 平台能用的,Linux 能打包 Linux 能用的,我要想在 win 上用,需要在 win 上装 pyinstaller ?但是我没有 win 电脑。
    fulei
        12
    fulei  
    OP
       288 天前
    @harrozze 我慢慢啃一下,英文太差了 感谢
    harrozze
        13
    harrozze  
       288 天前
    @harrozze #10 不对,你在 mac 里跑不了 windows 的 python ,除非你对 py2exe 弄出来的打包文件很熟,否则还是会比较麻烦。
    fulei
        14
    fulei  
    OP
       288 天前
    @sadfQED2 涉密电脑,不联网,不接外设。仅能通过 emos 传非常小的文件进去
    houshuu
        15
    houshuu  
       288 天前
    简短的话, 建议用 go 或者别的支持交叉编译的语言重写, 对于非联网设备, 一劳永逸
    ysc3839
        16
    ysc3839  
       288 天前 via Android
    直接安装一个 Python 不就能运行了吗?
    cnbatch
        17
    cnbatch  
       288 天前 via Android
    没错,Win10 自带 PowerShell 。其实 Win7 开始就自带了。
    fulei
        18
    fulei  
    OP
       288 天前
    @houshuu 非常短,83 行。我完全不懂 go, 请问用 go 写的东西,可以在 m 芯片 Mac 上编译出 x86_64 win10 可用的可执行文件吗?可以的话,我去学习下
    fulei
        19
    fulei  
    OP
       288 天前
    @ysc3839 公司电脑。不能联网,不能接外设。
    richarddingcn
        20
    richarddingcn  
       288 天前
    啊?是我有问题还是咋的
    都非常简单的 python script 了 是用到什么不能跨平台的依赖了么
    直接 win 上装个 python 直接运行 .py 文件不就行了
    ysc3839
        21
    ysc3839  
       288 天前 via Android
    @fulei 不能的话,那你怎么把标题所说的可执行文件弄进去呢?
    fulei
        22
    fulei  
    OP
       288 天前
    @cnbatch PowerShell 是写 bat 脚本的吗?不引用外部的库是不是实现不了啊,我有用 pip install chardet tqdm 这两个东西
    ClericPy
        23
    ClericPy  
       288 天前
    下个绿色版 python 解释器, 然后用 zipapps 或 shiv 打包个 pyz. 到机器上用解释器运行 pyz 就行了. pyz 里带了依赖和原代码包

    但是如果依赖里有 .pyd/.so 之类的, 以及 C-lib 之类的, 就麻烦一些, 去 pypi.org 下载 whl 到目标机器安装
    fulei
        24
    fulei  
    OP
       288 天前
    @ysc3839 内部系统,建工单,以附件的形式,传一个小文件。大小有限制
    JensenQian
        25
    JensenQian  
       288 天前   ❤️ 1
    楼下网吧
    付费开发
    效率提高
    岂不美哉
    suarezding
        26
    suarezding  
       288 天前
    @fulei 类似的单位,我来回答一下吧,应该是在本地 m 芯片电脑上开发了一个 python 脚本,需要在内网 x86 win10 上离线运行吧?
    我个人的话,也建议代码行数不多的情况下,使用 Go 重构,参考这个代码量,应该不复杂,使用系统库能完成,功能也比较简单,Go 也很容易上手.可以在 m 芯片上交叉编译出目标电脑上的 exe 程序.
    ysc3839
        27
    ysc3839  
       288 天前 via Android
    @fulei 限制多大? Python Windows 版有个嵌入式的包,也就 10MB 左右,自己打包的话未必会更小。
    elechi
        28
    elechi  
       288 天前
    虚拟机装个 windows ,arm 版的也行;调试通过之后放到目标机上用就行
    louzhichen
        29
    louzhichen  
       288 天前
    找一个大神,让他用一块磁铁直接操作硬盘,写出 python 解释器,然后你就可以用了。
    liantian
        30
    liantian  
       288 天前   ❤️ 5
    准备工作,下载 windows embeddable 版本的 python ,3.8 以后的版本官网都有。

    1. 在 mac 上,pip freeze > requirements.txt 导出依赖
    2. 在 mac 上,pip download --platform win64 -r requirements 。txt 下载 windows 版本的依赖。
    3. 下载 pip ,https://bootstrap.pypa.io/get-pip.py

    将上述文件拷贝到 windows ,方法你随意。


    解压 windows embeddable 版本的 python
    修改掉 pth 文件。取消注释 import site
    然后 python.exe get-pip.py 安装 pip
    然后 python.exe -m pip install -r requirements 。txt --no-index --find-links D:/下载/的/依赖/的/路径

    完事
    cnbatch
        31
    cnbatch  
       288 天前 via Android
    既然你自己就有 Arm Windows 虚拟机,打开看一下不就知道了。
    PowerShell 和 bat 是两回事。
    PowerShell 除了 PS 自带命令,还可以调用 .net 类库,就是麻烦点。
    bat 无法调用 .net 类库,它就是个 cmd 的脚本而已。
    aisk
        32
    aisk  
       288 天前
    用 nuitka 编译成二进制试试
    xuc
        33
    xuc  
       288 天前 via Android
    Mac 能联网对吧,开台云电脑(比如腾讯轻量云、阿里无影云桌面,都有新手优惠)
    musi
        34
    musi  
       288 天前
    @fulei #3 google 一下 python 官网,在里面找到对应的可执行文件,然后 bat 的话你问问 gpt 应该能给你生成一个完整的脚本
    xuc
        35
    xuc  
       288 天前 via Android
    没说完,开台 Windows 系统的云电脑,然后你就可以打包成需要的 exe 文件了,打包方法相信你也已经查过了
    misaka00001
        36
    misaka00001  
       288 天前 via Android
    把代码粘贴进去
    https://www.codeconvert.ai/python-to-golang-converter
    转换成 golang 再跨平台编译
    fulei
        37
    fulei  
    OP
       288 天前
    @liantian 感谢 “修改掉 pth 文件。取消注释 import site“ 这个我不太理解,我网上搜了下,指的是 Windows embeddable 版本的 Python 目录中 sitecustomize.py 这个文件吧。我上班用这个方法尝试下。
    fulei
        38
    fulei  
    OP
       288 天前
    @xuc 感谢,可以开台便宜的 linux, dd 个 windows ,开 rdp 上去吧。我没想到这个哈
    fulei
        39
    fulei  
    OP
       288 天前
    @misaka00001 请问我在左边黏贴了 python 代码后,点击 convert button ,得到右边转换的代码,我应该怎么用?有时间的话请给我多少两句,需要下载什么,需要做什么,我去搜索学学。感谢
    fulei
        40
    fulei  
    OP
       288 天前
    @xuc 感谢,我先试下 30 楼和 36 楼不花钱的方法。不行就 vps dd 个 Windows 。
    18601294989
        41
    18601294989  
       288 天前
    chatgpt 把 python 转成 golang
    dianso
        42
    dianso  
       288 天前
    闲鱼找人,最多 100 块钱就弄好了
    fulei
        43
    fulei  
    OP
       288 天前
    @dianso 主要是考虑安全方面的问题,单位的密级电脑,我自己也没本事审查别人编译的
    mm163
        44
    mm163  
       288 天前
    arm win 不是直接能运行 amd64/x86 吗?
    在 arm win 下用 x86_64 版本的 Python 工具开发和打包转 exe 不就得了。
    harrozze
        45
    harrozze  
       288 天前
    @fulei #39 右边的代码 copy 出来,在你 mac 上装个 go ( https://go.dev),然后用 go 交叉编译成 x86_64 windows 的程序

    `GOOS=windows GOARCH=amd64 go build -o bin/app-amd64.exe app.go`
    harrozze
        46
    harrozze  
       288 天前
    @fulei #39 golang 是静态链接,编译出来的东西会比较大。不过我也没比较过 py2exe 编译出来的大小和 go 版本有多大差距
    harrozze
        47
    harrozze  
       288 天前
    @liantian #30 感觉这个答案比较靠谱,如果你 import 的依赖包比较多的话,转成 golang 不知道能不能完全找到替代的包。
    dcsuibian
        48
    dcsuibian  
       288 天前 via Android
    楼主应该是想分发.exe 文件,而不是分发 python 源代码
    fulei
        49
    fulei  
    OP
       288 天前
    @dcsuibian 分发是什么意思,我不是行业内的,太专业的我搞不懂。我有一项工作内容是从系统里导出一个压缩包,解压后是将近 2 百个 csv 文件,每个 csv 文件里有 1 万行。然后拿这些数据进行下一步。但是它文件个数太多了,鼠标点半天,我就想把那些近 200 个文件每 70 个合并成一个文件,这样我的工作量就会减少很多。
    renyijiu
        50
    renyijiu  
       288 天前
    @aisk nutika 不支持交叉编译
    liantian
        51
    liantian  
       287 天前 via iPhone
    @fulei 有个扩展名 pth 的文件,可以文本编辑器打开…
    aptx4689
        52
    aptx4689  
       287 天前
    @fulei 你说的这些工作完全可以用 powershell 写一遍,不会的话问下 chatgpt 4.0 就好了,python 引入一堆包很麻烦的
    aptx4689
        53
    aptx4689  
       287 天前
    而且 powershell 也有 mac 版本,可以供你测试
    zx945
        54
    zx945  
       287 天前 via iPhone
    借一个别人的 windows 电脑安装 Python 环境,然后用 pyinstaller 打包成 exe 拷到目标电脑上,不过打包出来的 exe 最小也得 10MB 以上了,不知道所谓的只能上传小文件是有多小
    zx945
        55
    zx945  
       287 天前 via iPhone
    或者换一个思路,联系公司 IT 申请在内部系统上配置好 python 环境以及自己这个脚本需要的包,这样貌似更合规一些
    fox0001
        56
    fox0001  
       287 天前 via Android
    类似的需求,我会用 go 去写。Linux 下,go 源码可以编译成对应各个主流系统平台的可执行文件。
    ryd994
        58
    ryd994  
       287 天前 via Android
    运维 Windows 电脑非要用 MacOS ,这不是给自己找麻烦吗?
    让公司配台 Windows 电脑或者楼上说的,远程桌面
    如果你非要用 MacOS ,那我尊重你的命运
    95276
        59
    95276  
       287 天前 via iPhone
    用 go 写,交叉编译是最方便的。
    bef0rewind
        60
    bef0rewind  
       287 天前
    建议你走涉密流程,安全无小事。
    mariahlamb31
        61
    mariahlamb31  
       287 天前
    可以使用 PyInstaller 、cx_Freeze 等工具将脚本打包成跨平台可执行文件,然后在 Mac 上生成适用于 win10 的可执行版本。

    在 Mac 上通过虚拟机软件(VirtualBox 、VMware 等)或用 Docker 创建 win10 虚拟环境,在其中运行 Python 脚本。

    将 Python 脚本部署到公有云服务商(AWS 、Azure 、GCP 等)提供的 win10 云主机实例上运行。
    minamike
        62
    minamike  
       287 天前
    为什么不问问神奇的 ChatGPT 呢
    sunrisewestern
        63
    sunrisewestern  
       287 天前
    你如果有调用包的话,就算几行的 python 脚本打包完也有几百 MB
    xuc
        64
    xuc  
       287 天前 via Android
    @fulei 别 dd 了,阿里的无影云可以免费试用,开通就是 Windows
    m1klos
        65
    m1klos  
       287 天前 via Android
    借一台 Windows 或者去网吧或者瞅瞅有没有免费试用的云电脑
    charlieethan
        66
    charlieethan  
       287 天前
    这还不容易,用 GitHub CI ,运行环境使用 windows-2022 ,用 pyinstaller 命令行打包即可
    iOCZ
        67
    iOCZ  
       287 天前
    用 git workflow 打包成 exe
    tairan2006
        68
    tairan2006  
       287 天前
    @fulei #18 把 Python 脚本贴给 chatgpt ,让它翻译成 go ,然后`CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go` 交叉编译成 windows 的 exe 。
    iorilu
        69
    iorilu  
       287 天前
    要么花钱找人编译下

    要么下载个 python 到那个 win 上装下, 把代码拷过去
    ctro15547
        70
    ctro15547  
       287 天前
    有没有可能 云一台桌面电脑打包一个 exe , 按时计费的那种才几块钱一小时 足够打包了
    rming
        71
    rming  
       287 天前
    1. 学习 rust 或者 go 2. 重写这段代码
    hefish
        72
    hefish  
       287 天前
    买一台 x86 的电脑嘛。
    用完再卖掉。

    能用钱解决的事儿,都不叫事儿。
    GeruzoniAnsasu
        73
    GeruzoniAnsasu  
       287 天前
    重保是吧
    我干过类似的,而且我的 python 脚本更长,200 行左右


    最后的解决方法是想办法让单位内部装上了 py 和 vscode ,然后把我手机放旁边对着抄了一遍。


    当然了,我是纯内建库实现的,别想着用第三方包,那是给自己挖坑。
    如果有界面或可视化需求,那就想办法渲染一个 html 出来,http 服务用内建库也完全够写了。
    我当初差点还要手撸 html parser ,不过后来想想反正我要扒的目标网页也就那么一两个,于是用更 hard coded 的方式糊过去了
    Hopetree
        74
    Hopetree  
       287 天前
    用 pyinstaller 打包,在什么平台打出来的包就可以在什么平台运行,所以你找个 x86_64 的平台打包就行
    brookegas
        75
    brookegas  
       287 天前
    #36 楼 是终极答案

    1 、将 python 代码自动转成 Go 代码
    2 、使用 Go 的交叉编译,直接输出 windows 版本的 exe 文件
    ch2
        76
    ch2  
       287 天前
    github action 编译
    Lychee0
        77
    Lychee0  
       287 天前 via iPad   ❤️ 1
    丢 GitHub Action 拿 Pyinstaller 打包下就好,看 OP 描述应该不会有什么大坑。给个示例:

    ```
    name: CI

    # Controls when the workflow will run
    on:
    # Triggers the workflow on push or pull request events but only for the "main" branch
    push:
    branches: [ "main" ]
    paths-ignore:
    - '**.md'
    - 'LICENSE'

    pull_request:
    branches: [ "main" ]
    paths-ignore:
    - '**.md'
    - 'LICENSE'

    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:

    jobs:
    CI:
    strategy:
    matrix:
    python-version: [ "3.10" ]
    os-version: [ "macos-latest", "windows-latest", "ubuntu-20.04" ]

    runs-on: ${{ matrix.os-version }}
    steps:
    - uses: actions/checkout@v3
    with:
    submodules: recursive

    - uses: actions/setup-python@v4
    with:
    python-version: ${{ matrix.python-version }}
    architecture: x64

    - name: Build
    run: |
    pip install -r requirements.txt
    pip install pyinstaller
    python -m PyInstaller -F -n PKGName -i __main__.py

    - name: upload
    uses: actions/upload-artifact@v3
    with:
    name: PKGName-${{ matrix.os-version }}
    path: dist
    ```
    Lychee0
        78
    Lychee0  
       287 天前 via iPad
    缩进被吞了 hhh 按 yaml 和 action 要求改下吧
    loveuer
        79
    loveuer  
       286 天前 via Android
    @aptx4689 我最近正好遇到这个问题了,ps1 脚本在 win11 上默认不能通过左键或者右键点击运行了,需要提前开启允许运行才行,这对小白来说有点不太现实。考虑换 tinygo 生成 exe ,但是不能动态生成就没找到更好的方案
    JustBecause
        80
    JustBecause  
       286 天前
    某鱼上随便找个人帮你编译一下得了,不到百行代码编译一下,五块钱肯定有人愿意做
    aptx4689
        81
    aptx4689  
       285 天前
    @loveuer 他是自己写自己用啊。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2827 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 15:04 · PVG 23:04 · LAX 08:04 · JFK 11:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.