陶远航 发表于 2023-2-3 18:05:01

自己编译出的pyd怎么导入?

本帖最后由 陶远航 于 2023-2-3 20:57 编辑

我编译了这样一个pyd:
https://www.123pan.com/s/J1LlVv-GvoXv
提取码:1111
就是用户登录6.0的那个
如图,放在同一目录还可以运行
https://i.328888.xyz/2023/02/03/N4FFa.png
放在site-package中也可以正常导入
https://i.328888.xyz/2023/02/03/N45xL.png
但是为什么打包成exe就无法导入了(我说的是那个py文件,不是pyd)
如图
https://i.328888.xyz/2023/02/03/N4L85.png
求助

tommyyu 发表于 2023-2-3 19:00:54

1. 请把你的报错信息发全
2. 这个帖子是提问帖,不是吹水帖,你作为提问者能不能有一些基本的尊重,别***坑人
3. 建议把“求评分”那一行删掉,这又不是什么优质帖子,而且优质帖子即使你不求评分别人也是会给你评分的。

人造人 发表于 2023-2-3 19:05:15

本帖最后由 人造人 于 2023-2-3 19:06 编辑

首先,看看这个吧
https://github.com/ruby-china/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
然后,下面是一个简单的演示
参考
https://docs.python.org/zh-cn/3/extending/extending.html
https://docs.python.org/zh-cn/3/extending/building.html#building

sh-5.1$ ls
main.pyspam.c
sh-5.1$ cat spam.c
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdlib.h>

static PyObject *spam_system(PyObject *self, PyObject *args) {
    const char *command;
    if(!PyArg_ParseTuple(args, "s", &command)) return NULL;
    int ret = system(command);
    return PyLong_FromLong(ret);
}

static PyMethodDef methods[] = {
    {"system",spam_system, METH_VARARGS, "Execute a shell command."},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef spammodule = {
    PyModuleDef_HEAD_INIT,
    "spam",
    NULL,
    -1,
    methods
};

PyObject *PyInit_spam(void) {
    return PyModule_Create(&spammodule);
}
sh-5.1$ cat main.py
#!/usr/bin/env python
#coding=utf-8

import spam

spam.system('ls')
spam.system("echo 'hello world!'")
sh-5.1$ gcc -g -Wall -shared -I /usr/include/python3.10 -o spam.so spam.c
sh-5.1$ ls
main.pyspam.cspam.so
sh-5.1$ ./main.py
main.pyspam.cspam.so
hello world!
sh-5.1$

人造人 发表于 2023-2-3 19:12:02

不要把你编译好的文件放到标准库目录下面

isdkz 发表于 2023-2-3 19:52:36

我打包了没有问题,说清楚点,你是怎么打包的,

或者你把你打包好后的可执行文件和 pyinstaller 生成的 .spec 文件放上来

liuhongrun2022 发表于 2023-2-3 20:15:36

求评分删掉
at人删掉
这是求助帖

isdkz 发表于 2023-2-3 20:26:23

你是不是在 login.py 加了这一行代码? from login import main

不能自己导入自己,你另外开一个文件来导入 login

陶远航 发表于 2023-2-3 21:06:31

isdkz 发表于 2023-2-3 20:26
你是不是在 login.py 加了这一行代码? from login import main

不能自己导入自己,你另外开一个文件来 ...

还是不行,请详细说一下
或者文件在下面,帮我打包
成功后告诉我怎么打包的。谢谢




isdkz 发表于 2023-2-3 21:20:57

陶远航 发表于 2023-2-3 21:06
还是不行,请详细说一下
或者文件在下面,帮我打包
成功后告诉我怎么打包的。谢谢

我的打包命令:

pyinstaller -F -w "user login.py" --hiddenimport tkinter --hiddenimport tkinter.messagebox --hiddenimport easygui

isdkz 发表于 2023-2-3 21:31:19

陶远航 发表于 2023-2-3 21:06
还是不行,请详细说一下
或者文件在下面,帮我打包
成功后告诉我怎么打包的。谢谢

你是怎么打包的没有描述出来,所以没有办法帮你找出你打包失败的原因

但是我可以说你那个报错是因为循环导入

循环导入就是 A 导入了它自己,或者 A 导入了 B 同时 B 也导入了 A

你发出来的那两个文件没有这样的问题,所以我想不通你是怎么出错的

陶远航 发表于 2023-2-4 08:28:12

isdkz 发表于 2023-2-3 21:31
你是怎么打包的没有描述出来,所以没有办法帮你找出你打包失败的原因

但是我可以说你那个报错是因为循 ...

我是pyinstaller-F .\"user login.py"
这样打包成功,但报错。但是为什么你后面加了那么一长串,就可以打包成功且不报错?

isdkz 发表于 2023-2-4 08:48:57

本帖最后由 isdkz 于 2023-2-4 08:56 编辑

陶远航 发表于 2023-2-4 08:28
我是pyinstaller-F .\"user login.py"
这样打包成功,但报错。但是为什么你后面加了那么一长串,就可 ...

我加后面那一长串并不是因为循环导入的问题,但是你放的截图的报错信息是循环导入的问题

我加后面那一长串的原因是:
因为你把 login.py 编译成了 login.pyd,所以 pyinstaller 无法分析出 login.pyd 中导入了什么库,

login.pyd 中需要的库也就不会一起打包,所以就得通过 --hiddenimport 来告诉他哪些库需要导入

如果不加 --hiddenimport 的话运行会报 Module Not Found 的错

Mike_python小 发表于 2023-2-4 10:41:54

你要是来这里搞人我建议你出门左转

陶远航 发表于 2023-2-4 11:02:22

isdkz 发表于 2023-2-4 08:48
我加后面那一长串并不是因为循环导入的问题,但是你放的截图的报错信息是循环导入的问题

我加后面那 ...

谢谢

isdkz 发表于 2023-2-4 11:09:23

陶远航 发表于 2023-2-4 11:02
谢谢

不客气{:5_109:}
页: [1]
查看完整版本: 自己编译出的pyd怎么导入?