OSX 10.12下C程序调用Python脚本出现模块找不到问题
解决OSX 10.12下C程序fork后execlp调用Python脚本找不到模块的问题
我之前在OSX环境下也碰到过几乎一模一样的问题!通过C程序fork子进程调用Python脚本时,经常会因为环境变量差异或者Python版本不匹配导致模块找不到,给你几个亲测有效的解决思路:
1. 明确指定Python解释器的绝对路径
OSX默认自带的Python是2.7版本,而你在终端里运行脚本用的大概率是自己安装的Python3(比如brew安装的)。execlp默认会优先找系统路径里的Python,这就导致调用的解释器和你装模块的版本不匹配。
- 先在终端里执行
which python3(或者which python,看你平时用哪个),得到解释器的绝对路径,比如/usr/local/bin/python3 - 在C代码里把
execlp的第一个参数换成这个绝对路径,比如:execlp("/usr/local/bin/python3", "python3", "/path/to/your_script.py", NULL);
2. 手动设置PYTHONPATH环境变量
fork后的子进程不会继承终端里的全部环境变量,尤其是PYTHONPATH(模块搜索路径)。你可以在调用execlp前用setenv手动添加模块所在的路径:
- 先执行
pip show requests,找到模块的安装路径,比如Location: /usr/local/lib/python3.9/site-packages - 在C代码里添加环境变量设置:
#include <stdlib.h> // 需要引入这个头文件用setenv // ... 其他代码 ... if (pid == 0) { // 设置PYTHONPATH为你的模块安装路径 setenv("PYTHONPATH", "/usr/local/lib/python3.9/site-packages", 1); execlp("/usr/local/bin/python3", "python3", "/path/to/your_script.py", NULL); perror("execlp failed"); exit(1); }
3. 给Python脚本加正确的Shebang行
给你的脚本开头加上和解释器对应的Shebang,然后给脚本赋予执行权限,这样直接调用脚本也能确保用对解释器:
- 脚本开头添加:
#!/usr/local/bin/python3 import requests from bs4 import BeautifulSoup # ... 你的代码 ... - 终端执行
chmod +x your_script.py给脚本加执行权限 - C代码里直接调用脚本路径:
execlp("/path/to/your_script.py", "your_script.py", NULL);
4. 避免用sudo安装模块
sudo pip install会把模块装到系统Python的路径里,而你自己用的Python(比如用户目录下的)可能访问不到。建议用pip install --user requests来安装模块,这样模块会被放到用户专属的Python路径下,后续调用时只要用对解释器就能找到。
内容的提问来源于stack exchange,提问作者A__
相关产品推荐
相关产品推荐

