c - 在 MacOS 中获取 pre-shebang 可执行路径(相当于 getauxval(AT_EXECFN) )
问题描述
对于bash - Detect if a script is being running through shebang or is specified as a command line argument - Unix & Linux Stack Exchange中描述的问题,我们需要区分脚本是通过 shebang 运行还是作为口译员。
该问题的答案建议使用 -- 获取 pre-shebang 可执行文件名称getauxval(AT_EXECFN)
,但仅在 Linux 中有效。
由于 Pyenv 项目也正式支持 MacOS,如果我们要考虑该解决方案,我们需要一个等效的。
我已经检查了Find current executable's path without /proc/self/exe - 但两者都_dyld_get_image_name(0)
给出_NSGetExecutablePath
了 post-shebang 名称。这是我用来检查的示例程序(请参阅上面的问题链接了解它的使用方式;它的编译结果需要代替python3
该问题中给出的 Bash 脚本):
#include <stdio.h>
#include <unistd.h>
/*#include <sys/auxv.h>*/
#include <mach-o/dyld.h>
#include <sys/param.h>
#include <alloca.h>
int main(int argc, char** argv) {
//char *at_execfn = (char*)getauxval(AT_EXECFN);
//const char *at_execfn = _dyld_get_image_name(0);
char *at_execfn = (char*)alloca(MAXPATHLEN);
uint32_t at_execfn_len = MAXPATHLEN;
_NSGetExecutablePath(at_execfn,&at_execfn_len);
printf("original executable: '%s'\n",at_execfn);
for(int i=0; i<argc; i++) {
printf("'%s'\n",argv[i]);
}
execvp("python3",argv);
}
解决方案
该答案基于以下假设;我相信其他人会审查它们是否真实,但据我了解,它们是:
- Python 脚本只有在直接执行时才会使用 shebang。
- 否则,第一个命令行参数将始终是
python
,python3
或其他一些变体(python3.x
等)。
你已经可以得到原始文件的路径,这很好,因为你可以阅读shebang的内容,但你还不知道shebang是否被使用,对吧?Python 3.10 提供了一个吸引人的解决方案:sys.orig_argv
,它包括所有命令行参数,而不仅仅是那些从程序名称向前的参数,就像你使用普通的那样sys.argv
。
但是,我确定您不会在 pyenv 中实现 3.10 独有的功能!如果是这种情况,您可以查看较旧的 C-API Py_GetArgcArgv
,其文档仅说明:
在 Python 修改它们之前获取原始命令行参数。
无论哪种方式,我认为拥有文件路径以便您可以阅读 shebang 是难题的第一部分。第二部分是弄清楚是否实际使用了 shebang,我认为答案在大多数情况下都在命令行参数中。
推荐阅读
- http - 如何重定向到登录页面,但仅在浏览器导航到页面时
- python - 对 Python 非常陌生,需要 Selenium Webdriver 来检查复选框
- python - Pyinstaller - 无法在没有管理员权限的情况下创建 .exe
- java - IntelliJ 终端有不同的环境路径?
- c# - SQL 中更新的数据类型在 C# 中无法识别
- rspec - 如何在 rspec 的救援子句中测试代码
- r - 如何手动确定矩阵是否对称?
- javascript - D3.js 地图未出现
- reactjs - Uncaught SyntaxError: Unexpected token '<' from ReactJS when behind Gateway (Reverse Proxy)
- javascript - 如何使用 axios“js”发送 requestBody?