V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  chaoschick  ›  全部回复第 4 页 / 共 16 页
回复总数  305
1  2  3  4  5  6  7  8  9  10 ... 16  
向日葵吧
将 Python 项目打包成一个动态链接库( DLL )可以通过使用 py2dll 或者 PyInstaller 配合一些手动操作来完成。

首先,确保 Python 项目中的所有依赖项都已经被安装并且可以在项目中导入。

接下来,您可以使用 PyInstaller 将 Python 脚本打包成单一的可执行文件,PyInstaller 有一个选项--onefile ,能够将所有的依赖项打包到一个文件中,包括 Python 解释器和所有库文件。

PyInstaller 不能直接生成 DLL ,但您可以首先生成一个 EXE ,然后将其转换为 DLL 。对于转换,这通常需要手动操作以及对 C/C++的理解,因为您可能需要编写一些额外的代码来导出 DLL 的符号。

这里是一个高级概览的步骤:

1. 使用 PyInstaller 将 Python 项目打包成 EXE:
pyinstaller --onefile your_script.py

使用--onefile 选项打包您的脚本及其所有依赖项。

2. 创建 C/C++的包装器代码,这代码会作为 DLL 对外提供接口,并内部调用 Python 解释器执行您的 Python 代码。

3. 编译这个 C/C++代码到 DLL ,链接上一步创建的可执行文件包含的静态库或者动态库。

4. 确保 Python 运行环境(如 Python 解释器和所需的库文件)对 DLL 是可见的,可以通过添加环境变量或者将它们放置在预定的目录。

注意:这是一个比较复杂的过程,需要一定的编程和操作系统内部工作机制的知识,如果您不熟悉这些概念,那么建议寻求更专业的帮助或者使用其他解决方案。

此外,您还可以考虑使用 Cython 来编译 Python 代码为 C 代码,然后生成 DLL ,但这通常需要您的代码适应 Cython 的一些限制。

对于静态打包所有 Python 依赖到一个 DLL 文件,目前没有一个标准的解决方案,通常需要一些定制和手工操作。可以考虑打包你的 Python 环境和脚本到一个虚拟环境中,然后将整个虚拟环境连同生成的 DLL 一起分发。
128 天前
回复了 congu 创建的主题 职场话题 幼稚青年茫然不知所措,急求前辈指点
@jones2000 赞同 一切为了生存
以前我一直以为编译器优化能提升的性能很小,这次真是长见识了
@diivL #include <sys/time.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
struct timeval start_time, end_time;

gettimeofday(&start_time, NULL);

long count = 2147483640;
long i = 0;

do {
++i;
} while (--count);

gettimeofday(&end_time, NULL);

int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec);
printf("%d us", total_time);
printf("\n");
printf("%.3f ms", (double) total_time / 1000);
printf("\n");

printf("%l", i);
return 0;
}
[admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c -O3 && ./a.out
1 us
0.001 ms

这是优化掉 for 循环了吗?
@diivL [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c -O3 && ./a.out
3688484 us
3688.484 ms
public class DuffDevice {

private static long duff2(long count) {
long i = 0;
do {
++i;
} while (--count >0);
return i;
}

public static void main(String[] args) {
long duff;
long start, end;
DuffDevice duffDevice = new DuffDevice();

start = System.currentTimeMillis();
duff = duff2((long) Integer.MAX_VALUE - 7);
end = System.currentTimeMillis();
System.out.println(duff + " " + (end - start) + " ms");
}
}

输出
2147483640 639 ms

我改了一下 i 值的类型 耗时 变长了
所以 应该没把循环优化掉吧
@tool2d [admin@iZt4ngr7j75qbzgg9ilsifZ c]$ cat duff2.c
#include <sys/time.h>
#include <stdio.h>

int main(int argc, char* argv[]) {
struct timeval start_time, end_time;

gettimeofday(&start_time, NULL);

long count = 2147483640;
volatile long i = 0;

do {
++i;
} while (--count);

gettimeofday(&end_time, NULL);

int total_time = 1000000 * (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_usec - start_time.tv_usec);
printf("%d us", total_time);
printf("\n");
printf("%.3f ms", (double) total_time / 1000);
printf("\n");

printf("%l", i);
return 0;
}
[admin@iZt4ngr7j75qbzgg9ilsifZ c]$ gcc duff2.c && ./a.out
4621705 us
4621.705 ms
@tool2d 我试试
@xtreme1 能解释一下为什么两者性能如此悬殊的原因吗
134 天前
回复了 jiaomeng 创建的主题 OpenAI 文心一言只会废话,不能解决问题
不止废话 还没有上下文
塞翁失马焉知非福
134 天前
回复了 monkeyWie 创建的主题 JetBrains 我吐了, IDEA 新版本真的坑死人
2023.1 路过
实际尝试一下 亏了的话就当买个教训 不要留下遗憾 出事时能及时止损抽身离开就好
134 天前
回复了 hypoxia001 创建的主题 问与答 请问有 虚拟短信 这种服务或者平台吗
我司提供这种服务 但价格略贵
134 天前
回复了 dai269619118 创建的主题 程序员 想找一个自动生成视频的 api
有网站已经做出来了 api 就不知道有没有了
134 天前
回复了 LittleDust 创建的主题 编程 你每天编程多久?
8h
EBS 重复了
135 天前
回复了 Nosub 创建的主题 推广 华为云服务器 2 核 4G5M 云服务器 198/年
性价比太低
135 天前
回复了 Nosub 创建的主题 推广 华为云服务器 2 核 4G5M 云服务器 198/年
太贵了
1  2  3  4  5  6  7  8  9  10 ... 16  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1318 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 17:14 · PVG 01:14 · LAX 10:14 · JFK 13:14
Developed with CodeLauncher
♥ Do have faith in what you're doing.