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 · 2023-07-14 18:50:35 +08:00 · 5090 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2023-07-18 10:23:20 +08:00
    我已经成功打包成可以在可以在 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  
       2023-07-14 18:52:15 +08:00 via iPhone
    下 x86 的 Python 然后一起打成一个压缩包,写个 bat 解压执行
    sadfQED2
        2
    sadfQED2  
       2023-07-14 18:52:57 +08:00 via Android
    ?????
    python 脚本跟你 cpu 又没有半毛钱关系,你 win 电脑装个 python 解释器不就能运行了
    fulei
        3
    fulei  
    OP
       2023-07-14 18:55:49 +08:00
    @musi 能详细一点吗?我是 brew 安装的 python, 怎么知道是 x86 的还是 arm 的?怎么打包? bat 我也不会..
    fulei
        4
    fulei  
    OP
       2023-07-14 18:56:31 +08:00
    @sadfQED2 我没有 win 电脑,单位的 win 电脑不能联网。能说详细一点吗,我新新手
    aptx4689
        5
    aptx4689  
       2023-07-14 19:01:41 +08:00   ❤️ 1
    装 powershell ,把 python 用 powershell 重写一遍
    fulei
        6
    fulei  
    OP
       2023-07-14 19:03:45 +08:00
    @aptx4689 请问 powershell 是 win 10 自带的吗?我 python 用到的 chardet tqdm 这些库,在不能联网的公司电脑上,也没法下载
    baobao1270
        7
    baobao1270  
       2023-07-14 19:04:47 +08:00
    pyinstaller 打包试试?
    sadfQED2
        9
    sadfQED2  
       2023-07-14 19:05:08 +08:00 via Android
    https://www.python.org/downloads/windows/

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

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

    但是如果依赖里有 .pyd/.so 之类的, 以及 C-lib 之类的, 就麻烦一些, 去 pypi.org 下载 whl 到目标机器安装
    fulei
        24
    fulei  
    OP
       2023-07-14 19:23:57 +08:00
    @ysc3839 内部系统,建工单,以附件的形式,传一个小文件。大小有限制
    JensenQian
        25
    JensenQian  
       2023-07-14 19:24:03 +08:00   ❤️ 1
    楼下网吧
    付费开发
    效率提高
    岂不美哉
    suarezding
        26
    suarezding  
       2023-07-14 19:24:31 +08:00
    @fulei 类似的单位,我来回答一下吧,应该是在本地 m 芯片电脑上开发了一个 python 脚本,需要在内网 x86 win10 上离线运行吧?
    我个人的话,也建议代码行数不多的情况下,使用 Go 重构,参考这个代码量,应该不复杂,使用系统库能完成,功能也比较简单,Go 也很容易上手.可以在 m 芯片上交叉编译出目标电脑上的 exe 程序.
    ysc3839
        27
    ysc3839  
       2023-07-14 19:24:59 +08:00 via Android
    @fulei 限制多大? Python Windows 版有个嵌入式的包,也就 10MB 左右,自己打包的话未必会更小。
    elechi
        28
    elechi  
       2023-07-14 19:25:23 +08:00
    虚拟机装个 windows ,arm 版的也行;调试通过之后放到目标机上用就行
    louzhichen
        29
    louzhichen  
       2023-07-14 19:25:44 +08:00
    找一个大神,让他用一块磁铁直接操作硬盘,写出 python 解释器,然后你就可以用了。
    liantian
        30
    liantian  
       2023-07-14 19:26:29 +08:00   ❤️ 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  
       2023-07-14 19:28:08 +08:00 via Android
    既然你自己就有 Arm Windows 虚拟机,打开看一下不就知道了。
    PowerShell 和 bat 是两回事。
    PowerShell 除了 PS 自带命令,还可以调用 .net 类库,就是麻烦点。
    bat 无法调用 .net 类库,它就是个 cmd 的脚本而已。
    aisk
        32
    aisk  
       2023-07-14 19:34:34 +08:00
    用 nuitka 编译成二进制试试
    xuc
        33
    xuc  
       2023-07-14 19:35:07 +08:00 via Android
    Mac 能联网对吧,开台云电脑(比如腾讯轻量云、阿里无影云桌面,都有新手优惠)
    musi
        34
    musi  
       2023-07-14 19:37:24 +08:00
    @fulei #3 google 一下 python 官网,在里面找到对应的可执行文件,然后 bat 的话你问问 gpt 应该能给你生成一个完整的脚本
    xuc
        35
    xuc  
       2023-07-14 19:39:39 +08:00 via Android
    没说完,开台 Windows 系统的云电脑,然后你就可以打包成需要的 exe 文件了,打包方法相信你也已经查过了
    misaka00001
        36
    misaka00001  
       2023-07-14 19:40:51 +08:00 via Android
    把代码粘贴进去
    https://www.codeconvert.ai/python-to-golang-converter
    转换成 golang 再跨平台编译
    fulei
        37
    fulei  
    OP
       2023-07-14 19:41:42 +08:00
    @liantian 感谢 “修改掉 pth 文件。取消注释 import site“ 这个我不太理解,我网上搜了下,指的是 Windows embeddable 版本的 Python 目录中 sitecustomize.py 这个文件吧。我上班用这个方法尝试下。
    fulei
        38
    fulei  
    OP
       2023-07-14 19:43:30 +08:00
    @xuc 感谢,可以开台便宜的 linux, dd 个 windows ,开 rdp 上去吧。我没想到这个哈
    fulei
        39
    fulei  
    OP
       2023-07-14 19:48:51 +08:00
    @misaka00001 请问我在左边黏贴了 python 代码后,点击 convert button ,得到右边转换的代码,我应该怎么用?有时间的话请给我多少两句,需要下载什么,需要做什么,我去搜索学学。感谢
    fulei
        40
    fulei  
    OP
       2023-07-14 19:51:22 +08:00
    @xuc 感谢,我先试下 30 楼和 36 楼不花钱的方法。不行就 vps dd 个 Windows 。
    18601294989
        41
    18601294989  
       2023-07-14 20:05:58 +08:00
    chatgpt 把 python 转成 golang
    dianso
        42
    dianso  
       2023-07-14 20:10:37 +08:00
    闲鱼找人,最多 100 块钱就弄好了
    fulei
        43
    fulei  
    OP
       2023-07-14 20:13:26 +08:00
    @dianso 主要是考虑安全方面的问题,单位的密级电脑,我自己也没本事审查别人编译的
    mm163
        44
    mm163  
       2023-07-14 21:14:33 +08:00
    arm win 不是直接能运行 amd64/x86 吗?
    在 arm win 下用 x86_64 版本的 Python 工具开发和打包转 exe 不就得了。
    harrozze
        45
    harrozze  
       2023-07-14 21:14:55 +08:00
    @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  
       2023-07-14 21:15:53 +08:00
    @fulei #39 golang 是静态链接,编译出来的东西会比较大。不过我也没比较过 py2exe 编译出来的大小和 go 版本有多大差距
    harrozze
        47
    harrozze  
       2023-07-14 21:17:34 +08:00
    @liantian #30 感觉这个答案比较靠谱,如果你 import 的依赖包比较多的话,转成 golang 不知道能不能完全找到替代的包。
    dcsuibian
        48
    dcsuibian  
       2023-07-14 21:22:30 +08:00 via Android
    楼主应该是想分发.exe 文件,而不是分发 python 源代码
    fulei
        49
    fulei  
    OP
       2023-07-14 21:53:38 +08:00
    @dcsuibian 分发是什么意思,我不是行业内的,太专业的我搞不懂。我有一项工作内容是从系统里导出一个压缩包,解压后是将近 2 百个 csv 文件,每个 csv 文件里有 1 万行。然后拿这些数据进行下一步。但是它文件个数太多了,鼠标点半天,我就想把那些近 200 个文件每 70 个合并成一个文件,这样我的工作量就会减少很多。
    renyijiu
        50
    renyijiu  
       2023-07-14 22:08:30 +08:00
    @aisk nutika 不支持交叉编译
    liantian
        51
    liantian  
       2023-07-14 23:11:35 +08:00 via iPhone
    @fulei 有个扩展名 pth 的文件,可以文本编辑器打开…
    aptx4689
        52
    aptx4689  
       2023-07-15 00:33:40 +08:00
    @fulei 你说的这些工作完全可以用 powershell 写一遍,不会的话问下 chatgpt 4.0 就好了,python 引入一堆包很麻烦的
    aptx4689
        53
    aptx4689  
       2023-07-15 00:34:03 +08:00
    而且 powershell 也有 mac 版本,可以供你测试
    zx945
        54
    zx945  
       2023-07-15 00:45:09 +08:00 via iPhone
    借一个别人的 windows 电脑安装 Python 环境,然后用 pyinstaller 打包成 exe 拷到目标电脑上,不过打包出来的 exe 最小也得 10MB 以上了,不知道所谓的只能上传小文件是有多小
    zx945
        55
    zx945  
       2023-07-15 00:48:33 +08:00 via iPhone
    或者换一个思路,联系公司 IT 申请在内部系统上配置好 python 环境以及自己这个脚本需要的包,这样貌似更合规一些
    fox0001
        56
    fox0001  
       2023-07-15 00:48:37 +08:00 via Android
    类似的需求,我会用 go 去写。Linux 下,go 源码可以编译成对应各个主流系统平台的可执行文件。
    zx945
        57
    zx945  
       2023-07-15 00:57:24 +08:00 via iPhone
    ryd994
        58
    ryd994  
       2023-07-15 04:40:13 +08:00 via Android
    运维 Windows 电脑非要用 MacOS ,这不是给自己找麻烦吗?
    让公司配台 Windows 电脑或者楼上说的,远程桌面
    如果你非要用 MacOS ,那我尊重你的命运
    95276
        59
    95276  
       2023-07-15 05:20:55 +08:00 via iPhone
    用 go 写,交叉编译是最方便的。
    bef0rewind
        60
    bef0rewind  
       2023-07-15 07:25:58 +08:00
    建议你走涉密流程,安全无小事。
    mariahlamb31
        61
    mariahlamb31  
       2023-07-15 07:27:31 +08:00
    可以使用 PyInstaller 、cx_Freeze 等工具将脚本打包成跨平台可执行文件,然后在 Mac 上生成适用于 win10 的可执行版本。

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

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

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

    能用钱解决的事儿,都不叫事儿。
    GeruzoniAnsasu
        73
    GeruzoniAnsasu  
       2023-07-15 10:37:33 +08:00
    重保是吧
    我干过类似的,而且我的 python 脚本更长,200 行左右


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


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

    1 、将 python 代码自动转成 Go 代码
    2 、使用 Go 的交叉编译,直接输出 windows 版本的 exe 文件
    ch2
        76
    ch2  
       2023-07-15 13:44:03 +08:00
    github action 编译
    Lychee0
        77
    Lychee0  
       2023-07-15 14:51:27 +08:00 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  
       2023-07-15 14:53:03 +08:00 via iPad
    缩进被吞了 hhh 按 yaml 和 action 要求改下吧
    loveuer
        79
    loveuer  
       2023-07-16 21:45:52 +08:00 via Android
    @aptx4689 我最近正好遇到这个问题了,ps1 脚本在 win11 上默认不能通过左键或者右键点击运行了,需要提前开启允许运行才行,这对小白来说有点不太现实。考虑换 tinygo 生成 exe ,但是不能动态生成就没找到更好的方案
    JustBecause
        80
    JustBecause  
       2023-07-16 22:21:59 +08:00
    某鱼上随便找个人帮你编译一下得了,不到百行代码编译一下,五块钱肯定有人愿意做
    aptx4689
        81
    aptx4689  
       2023-07-17 12:49:13 +08:00
    @loveuer 他是自己写自己用啊。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2815 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 13:27 · PVG 21:27 · LAX 05:27 · JFK 08:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.