1. 程式人生 > >C語言不能呼叫Python

C語言不能呼叫Python

C語言是結構化程式語言,Python是面向物件的語言,二者之間有條“代溝”。

Python呼叫C語言,沒有問題,這叫“向下相容”。

但是,反過來則不行,不許C呼叫Python,那叫“以下犯上”。

敢這樣說,是因為我有實驗的證據。

為了MT4程式設計的需要,我用LCC編譯的程式呼叫Python,結果,撞上了南牆。

程式極其簡單:

#include "Python.h"
#include <stdio.h>
int main(){
    Py_Initialize();
    PyRun_SimpleString("Test=[1,2,3,4]");
    PyRun_SimpleString("print(Test)");
    Py_Finalize();
}

我用的是Python 2.6,因此設定連結庫Python26.lib。一切按規矩做的。

但是,編譯時,看到以下出錯資訊:

ccallp.obj .text: undefined reference to '__imp__Py_Initialize'
ccallp.obj .text: undefined reference to '__imp__PyRun_SimpleStringFlags'
ccallp.obj .text: undefined reference to '__imp__Py_Finalize'

忙活了5、6小時之後,問題依舊。開始懷疑編譯器本身有問題。

想到Python是用VC2003以後版本編譯的,早就面向物件了,只好試試VC了。

把上面的程式碼放到VC6的檔案裡編譯、執行,一切正常。

從網上一些帖子看,在Linux下也有類似問題。GCC編譯時出錯,用G++就沒問題。

由此可見,所謂“C呼叫Python”,準確地說,應該是“用C++呼叫Python”。

相關推薦

C語言呼叫python介面注意事項

1、需要設定python環境路徑 Py_SetPythonHome("C:\\Python27"); 否則初始化Py_Initialize();出錯 2、python的案例當做類似動態庫呼叫,不要有直接執行的程式碼 3、C向python的引數傳遞都是以組元的形式進行的

【VS2013】C語言呼叫Python指令碼環境搭建、函式呼叫呼叫demo.py指令碼an

#include <stdio.h> #include <stdlib.h> #include <string.h>#include <Python.h>int main(int argc, char** argv){int arg0 = 30;int arg1

新手學python(2):C語言呼叫完成資料庫操作

繼續介紹本人的python學習過程。本節介紹如何利用python呼叫c程式碼。內容還是基於音樂資訊提取的過程,架構如圖一。Python呼叫c實現的功能是利用python訪問c語言完成mysql資料庫操作。 在利用python呼叫c語言之前,我們需要首先完成c語言功能程式

windows 下 c++ 如何呼叫 python 3

本文所使用環境: win10 (x64) +  VS2013 + python 3.5.2 (x64) python官網下載地址 一、先配置環境 1.安裝python 2.把 python 新增到VS2013     (1) VS新建一個空的Win3

C語言呼叫GO語言生成的C靜態庫

一開始看別人的例子,自己弄總是不成功,後來也是去GO語言社群看多幾個例子,找找規律,才把幾個自己沒注意到的細(keng)節填起來了。 GO語言寫一個函式 cktest.go package main import ( "C" "fmt" ) //exp

C語言呼叫MySQL介面

說明:在做一個專案的過程中,用到了這部分知識,個人覺得網上關於這部分的介紹真的比較模糊,就自己總結一下專案中用到的這些介面的使用方法。 準備工作 這個專案是在Linux下開發,如果需要使

linux下利用CC++ 語言呼叫需要root許可權

一、簡介        linux對檔案的許可權控制比較嚴格,這樣避免了有特殊意圖的程式獲取root許可權,但在c++程式中希望獲取root的執行許可權去操作一些只有root可讀寫的檔案。 二、詳解 1、setuid法 (1)登入root使用者,將程式設定成ro

C語言呼叫C++中的函式,extern "C"的含義

C++編譯器在將cpp檔案編譯成庫時,匯出的函式名會改變,成員函式會通過加一些元素變成全域性函式,如果這時候我們需要用C語言呼叫C++的函式, 就有了一個問題,那就是不知道C++庫中匯出的函式名,這是由編譯器決定的,這個時候就需要用到extern關鍵字。例子: test.c

libcurl C語言呼叫

1、編寫程式碼 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #define POSTURL "6

關於c語言呼叫main函式自身,一點

2018年11月02日 20:27:55 Drmon. 閱讀數:6 標籤: c語言 呼叫自身

Ubuntu 使用 C語言呼叫 Shell 檔案 ,sudo 免密碼輸入,為 shell 檔案加殼繞過chmod 4755 許可權問題

需求: 當我們需要指令碼檔案輸入 su 或 sudo 的時候 ,會出現密碼輸入問題 ,如何實現自動輸入密碼? ps : 需求用在 二進位制檔案 呼叫 Shell 檔案的,為shell 檔案加殼繞過chmod 4755 許可權問題 建立 C檔案 #include

C++ 中呼叫python

學以致用 參考網站https://docs.python.org/3.3/c-api/index.html Py_SetPythonHome(); 用來設定Python指令碼的目錄,如需設定必須在init前 Py_Initialize(); 初始化python環境 PyObj

C語言擴充套件Python

最近一直在跟隨《PYTHON核心程式設計》學習一些python的編寫,可惜的是這本書的版本太過於陳舊。大部分範例程式碼都是python2的版本。 剛剛在看python用C語言寫擴充套件包的時候踩到了一個大坑,到現在沒用爬上來 跟其他的python程式碼一樣,擴充套件包也無非就是調包而已,要把python的

leetcode21題 題解 翻譯 C語言Python

21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s

leetcode66題 題解 翻譯 C語言Python

66. Plus One Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that th

leetcode112題 題解 翻譯 C語言Python

112. Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along th

leetcode258題 題解 翻譯 C語言Python

258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Gi

C#中呼叫python方法

1. 安裝IronPython 2. 建立專案 建立一個C#的控制檯應用程式。 新增引用: 瀏覽到IronPython的安裝目錄中,新增對IronPython.dll,Microsoft.Scripting.dll 兩個dll的引用。 3. 新增Pytho

C語言呼叫jni中JNIEnv指標使用和理解

使用C語言呼叫jni的時候,需要和java的環境物件和虛擬機器物件互動。它們的C語言定義如下。typedef const struct JNINativeInterface* JNIEnv; typedef const struct JNIInvokeInterface* J

C語言Python實現斐波那契數(Fibonacci)

1、C語言實現   有一對兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假設所有兔子都不死,問每個月的兔子總數為多少? #include<stdio.h> int main() { int f1=1,f2=1,f3; int i;