首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 system() 呼叫 Python 腳本返回 256:進程返回值解碼與排查指南

     編輯:程式設計綜合問答

返回值 256 含義解碼

system() 返回值為 **16 位元整數**,高位元組為訊號/退出碼,低位元組通常為 0。
256 = 1 << 8 → **高位元組 = 1,低位元組 = 0** → 子進程 **正常退出,退出碼 = 1**。

system() 內部流程與返回值規則


// 簡化邏輯
pid = fork();
if (pid == 0) {           // 子進程
    execl("/bin/sh", "sh", "-c", command, (char*)0);
    _exit(127);           // execl 失敗
} else {                  // 父進程
    waitpid(pid, &status, 0);
    if (WIFEXITED(status)) return WEXITSTATUS(status) << 8; // 正常退出
    if (WIFSIGNALED(status)) return WTERMSIG(status);        // 訊號終止
}

為何 Python 腳本退出碼為 1?

  1. 匯入失敗:ImportError、模組路徑錯誤 (系統 Python vs 虛擬環境)。
  2. 語法/執行期錯誤:腳本中有 sys.exit(1)、未捕獲例外。
  3. 權限/路徑問題:system() 繼承的環境變數 (PATH, PYTHONPATH) 與互動式 Shell 不同。
  4. 工作目錄不同:相對路徑 python script.py 在 system() 中解析為 /current/working/dir/script.py。

排查步驟

  1. 在 C 程式中印出完整命令:
    printf("CMD: %s\n", cmd); → 複製到終端機實測。
  2. 改用 popen() 捕獲標準輸出/錯誤:
FILE* fp = popen("python /path/script.py 2>&1", "r");
char buf[1024];
while (fgets(buf, sizeof(buf), fp)) printf("%s", buf);
int ret = pclose(fp); // 返回值同 system()
printf("Exit code: %d\n", WEXITSTATUS(ret));
  1. 在 Python 腳本開頭加入:
    import sys, traceback; sys.excepthook = lambda t,v,tb: traceback.print_exception(t,v,tb) 確保錯誤輸出到 stderr。

最佳實踐:避免 system(),改用 fork+exec 或庫

  • 需互動/管道:popen()、pipe()+fork()+exec()。
  • 單純啟動無需等待:fork() 子進程 execl(),父進程 waitpid(pid, NULL, WNOHANG)。
  • 跨平台:boost::process、Qt::QProcess、Python subprocess (若主程式為 Python)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved