¿Ejecutar un programa C en Python?

4 minutos de lectura

¿Ejecutar un programa C en Python?
Izz ad-Din Ruhulessin

Tengo este programa en C, al menos creo que lo es (archivos: spa.c, spa.h). ¿Hay alguna manera de que pueda ejecutar este script desde Python SIN pasar argumentos adicionales al intérprete de Python (si no, cuáles serían los argumentos?)

Actualizar: Gracias por sus respuestas. El código fuente se puede encontrar en http://www.nrel.gov/midc/spa/#register

(No se asuste por el ‘registro’ en la URL, si completa el formulario, puede descargar los archivos de inmediato (sin correos de validación, etc.) Probaré sus sugerencias e informaré los resultados.

Actualización 2: Compilé el código fuente usando gcc, pero ahora me da un permiso denegado cuando intento llamar (), incluso cuando ejecuto python como root (estoy en Ubuntu 10:10).

Actualización 3 [Errno 8] Error de formato ejecutivo

Actualización 4 Bien, lo tengo funcionando. El programa genera valores usando printf:

>>> call(['/path'])
Julian Day:    2452930.312847
L:             2.401826e+01 degrees
B:             -1.011219e-04 degrees
R:             0.996542 AU
H:             11.105902 degrees
Delta Psi:     -3.998404e-03 degrees
Delta Epsilon: 1.666568e-03 degrees
Epsilon:       23.440465 degrees
Zenith:        50.111622 degrees
Azimuth:       194.340241 degrees
Incidence:     25.187000 degrees
Sunrise:       06:12:43 Local Time
Sunset:        17:20:19 Local Time

¡Gracias a todos!

  • ¿Podría publicar aquí algunos extractos de su spa.c (o, mejor aún, el código completo)? Aunque existen algunas implementaciones de secuencias de comandos similares a C, normalmente C es un lenguaje compilado. Incluso si encuentra algún intérprete de C escrito en Python, las posibilidades de que funcione un programa C arbitrario son muy escasas.

    – atzz

    7 de diciembre de 2010 a las 12:12

  • Hasta donde yo sé, no hay ningún argumento que pueda convertir el intérprete de Python en un compilador de C. Pero puede usar python ctypes para ejecutar código C desde dlls o librerías compartidas.

    – Mijail Churbanov

    7 de diciembre de 2010 a las 12:20

No existe tal cosa como un guión C. Si te referías a un programa c necesitas compilar spa.c y spa.h en un ejecutable antes de ejecutarlo.

Si utiliza CCG en Linux o Mac OS X:

$ gcc -Wall spa.c -o spa

Obtendrá un ejecutable llamado spa.

Después de eso, puedes ejecutar spa programe desde su secuencia de comandos de Python con:

from subprocess import call
call(["./spa", "args", "to", "spa"])

  • Que debería args: una cadena con argumentos? Por ejemplo: args = "--option for my program"?

    – Sigur

    13 de noviembre de 2017 a las 22:52

  • Luego call(["your program", "--option", "for", "my", "program"]) si de hecho desea que la opción sea múltiples argumentos. Tal vez te refieres call(["your program", "--option", "for my program"]) pero solo tú puedes saber eso.

    – triplete

    29 de enero de 2019 a las 9:58


cinpy se acerca usando la increíble combinación de tcc y ctypes

El siguiente código se extrae de cinpy_test.py incluido en el paquete.

import ctypes
import cinpy

# Fibonacci in Python
def fibpy(x):
    if x<=1: return 1
    return fibpy(x-1)+fibpy(x-2)

# Fibonacci in C
fibc=cinpy.defc("fib",
                ctypes.CFUNCTYPE(ctypes.c_long,ctypes.c_int),
                """
                long fib(int x) {
                    if (x<=1) return 1;
                    return fib(x-1)+fib(x-2);
                }
                """)

# ...and then just use them...
# (there _is_ a difference in the performance)
print fibpy(30)
print fibc(30)

  • Alguien sabe donde puedo descargar ‘cinpy’? La URL original ya no está disponible.

    – OGP

    23 de julio de 2015 a las 6:03


  • Bien, lo encontré en Web Archive.

    – OGP

    23 de julio de 2015 a las 7:55

  • Aunque Cinpy se ve sin mantenimiento, es una herramienta útil. La horquilla del paquete: github.com/csarn/cinpy. La guía: amundblog.blogspot.com/2008/12/cinpy-or-c-in-python.html

    – Hiedra creciente

    30 de septiembre de 2018 a las 9:18

C no es un lenguaje de programación. Tienes que compilar spa.c en un ejecutable. No dices tu sistema operativo, pero si Mac o Linux, prueba

  gcc spa.c -o spa

Si eso funciona, ahora tiene un spa llamado ejecutable. Puedes usar python os.system() para llamarlo

¿Ejecutar un programa C en Python?
Shantanu Pathak

La pregunta es antigua, ¡pero sentí que falta una parte importante!

El código C se puede compilar Y ejecutar dentro del script de Python:

#include <iostream>
using namespace std;
int main(){
cout<<"Hello World\n";
return 1;
}



import subprocess
subprocess.call(["g++", "hello_world.cpp"]) # OR gcc for c program
tmp=subprocess.call("./a.out")
print("printing result")
print(tmp)


$ python main.py 
Hello World
printing result
1

Me referí a la publicación en Quora: https://www.quora.com/How-do-I-write-a-Python-script-to-run-aC-program

  • Probablemente deberías preferir subprocess sobre os.system()

    – triplete

    29 de enero de 2019 a las 9:58

¿Ha sido útil esta solución?