¿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

¿Como escribir una matriz multidimensional en un archivo de
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?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad