Archive
Call Python from C
Problem
You want to embed Python code inside a C program.
Solution
See this: http://docs.python.org/2/extending/embedding.html.
Example:
#include "Python.h"
int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print 'Today is',ctime(time())\n");
Py_Finalize();
return 0;
}
Compilation:
gcc -I/usr/include/python2.7 cool.c -lpython2.7 # or: clang -I/usr/include/python2.7 -lpython2.7 cool.c
Sample output:
Today is Mon Jul 1 00:53:10 2013
For more details, please refer to this page.
Update (20140216)
I tried this example today and clang dropped me this error:
/usr/include/limits.h:124:16: fatal error: 'limits.h' file not found
I have Clang 3.2 on my machine and it’s a known bug. There is a workaround:
$ cd /usr/lib/clang/3.2/ $ sudo ln -s /usr/lib/llvm-3.2/lib/clang/3.2/include
Update (20200202)
Today I tried it with Python 3.8. Docs: https://docs.python.org/3/extending/embedding.html . Sample source code:
#define PY_SSIZE_T_CLEAN
#include
int main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n");
if (Py_FinalizeEx() < 0) {
exit(120);
}
PyMem_RawFree(program);
return 0;
}
Compilation and execution:
$ gcc -I/usr/include/python3.8 call.c -lpython3.8 -o call $ ./call Today is Sun Feb 2 19:48:28 2020
It also works with clang, just replace “gcc” with “clang”.
Write Python inside Bash
Problem
You want to embed Python code inside a Bash script.
Solution
Here is a possible solution:
#!/usr/bin/bash
# name.sh
# Example:
# Write a bash script that has one parameter: your name.
# It prints every second character of your name.
TFILE="`basename $0`.$$.py"
cat <<END >$TFILE
#!/usr/bin/env python
import re
import sys
bash_name = re.sub(r'\.\d+\.py', '', sys.argv[0])
def process(s):
print s[::2]
def main():
if len(sys.argv) > 1:
process(sys.argv[1])
else:
print "Usage: {0} <parameter>".format(bash_name)
if __name__ == "__main__":
main()
END
chmod u+x $TFILE
./$TFILE "$@"
/bin/rm $TFILE
Usage:
./name.sh Your_Name Yu_ae # output
Blog Stats
- 1,652,052 hits
Random Post
Recent Posts
Archives
- December 2025 (1)
- December 2024 (2)
- March 2024 (1)
- February 2024 (3)
- June 2023 (1)
- December 2022 (1)
- May 2022 (1)
- March 2022 (1)
- February 2022 (2)
- October 2020 (3)
- September 2020 (2)
- July 2020 (1)
- December 2019 (1)
- November 2019 (7)
- June 2019 (2)
- May 2019 (1)
- February 2019 (1)
- January 2019 (1)
- August 2018 (1)
- July 2018 (4)
- June 2018 (5)
- May 2018 (1)
- March 2018 (2)
- February 2018 (1)
- January 2018 (2)
- December 2017 (2)
- October 2017 (1)
- August 2017 (1)
- May 2017 (2)
- April 2017 (1)
- March 2017 (1)
- February 2017 (3)
- January 2017 (5)
- December 2016 (3)
- October 2016 (2)
- September 2016 (1)
- August 2016 (4)
- July 2016 (3)
- June 2016 (2)
- May 2016 (2)
- April 2016 (1)
- March 2016 (4)
- February 2016 (1)
- January 2016 (4)
- December 2015 (5)
- November 2015 (8)
- October 2015 (2)
- September 2015 (3)
- August 2015 (6)
- July 2015 (4)
- June 2015 (1)
- May 2015 (3)
- April 2015 (2)
- February 2015 (1)
- January 2015 (6)
- December 2014 (5)
- November 2014 (2)
- October 2014 (1)
- September 2014 (1)
- August 2014 (14)
- July 2014 (3)
- June 2014 (6)
- May 2014 (3)
- April 2014 (2)
- March 2014 (4)
- February 2014 (3)
- January 2014 (19)
- December 2013 (8)
- November 2013 (9)
- October 2013 (4)
- September 2013 (10)
- August 2013 (16)
- July 2013 (4)
- June 2013 (7)
- May 2013 (7)
- April 2013 (3)
- March 2013 (12)
- February 2013 (2)
- January 2013 (10)
- December 2012 (18)
- November 2012 (3)
- October 2012 (4)
- September 2012 (5)
- August 2012 (1)
- July 2012 (1)
- May 2012 (8)
- April 2012 (9)
- March 2012 (17)
- February 2012 (3)
- January 2012 (8)
- November 2011 (11)
- October 2011 (7)
- September 2011 (17)
- August 2011 (5)
- June 2011 (1)
- May 2011 (7)
- April 2011 (21)
- March 2011 (21)
- February 2011 (7)
- December 2010 (4)
- November 2010 (1)
- October 2010 (16)
- September 2010 (15)
