2010-01-06 20 views
8
import itertools 
print itertools#ok 

el código está biendónde está el archivo '' itertools

pero no puede encontrar el archivo itertools.

que me puede decir donde es el 'archivo itertools' python2.5


mi código se ejecuta

import itertools 
print itertools.__file__ 


Traceback (most recent call last): 
    File "D:\zjm_code\mysite\zjmbooks\a.py", line 5, in <module> 
    print itertools.__file__ 
AttributeError: 'module' object has no attribute '__file__' 

Respuesta

17
>>> import itertools 
>>> itertools.__file__ 
'/usr/lib64/python2.6/lib-dynload/itertools.so' 

El hecho de que el nombre de archivo termina con .so significa que es un módulo de extensión escrito en C (en lugar de un módulo de Python normal). Si desea ver el código fuente, descargue la fuente de Python y mire en Modules/itertoolsmodule.c (también puede verla en su navegador al http://svn.python.org/view/python/trunk/Modules/itertoolsmodule.c?view=log).

Editar (como una respuesta al comentario más abajo): también funciona con Python 2.5:

Python 2.5.2 (r252:60911, Oct 5 2008, 19:29:17) 
[GCC 4.3.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import itertools 
>>> itertools.__file__ 
'/usr/lib/python2.5/lib-dynload/itertools.so' 
+0

gracias, pitrou, creo que tienes razón en python2.6, pero mi código ejecuta un error en python 2.5, no tiene un atributo llamado '__file__' – zjm1126

+0

¿Cuál es su compilación Python (versión, sistema operativo, origen)? Quizás el módulo se haya compilado de forma estática en lugar de dinámicamente. Pero '__file__' también funciona en Python 2.5: vea la respuesta editada arriba. En cualquier caso, la respuesta que di más arriba es correcta: el módulo está escrito en C y su código fuente está disponible en el árbol fuente oficial de Python. –

+0

hola Antoine P. mi sistema es windows_xp, el código que me das ejecuta un error, no sé lo que pasa. – zjm1126

1

probar esta actualización

>>> import imp 
>>> imp.find_module("itertools") 

: dado que el tuyo es Ninguno, otro pasa por una forma manual. Haga un sys.path

>>> import sys 
>>> sys.path 
['', '/usr/lib/python2.6/lib-dynload' ] 

Luego, dependiendo de su sistema, utilice la función de búsqueda de su sistema para encontrarlo. en mi sistema Linux

$ find /usr/lib/python2.6/lib-dynload -type f -iname "*itertools*" 
/usr/lib/python2.6/lib-dynload/itertoolsmodule.so 

O, simplemente buscar en el sistema entero para el archivo con el nombre "itertools".

+0

se returns (None, 'itertools', ('', '', 6)) – zjm1126

4

Si usted está buscando el archivo fuente (en C, por supuesto), es por ejemplo en línea here.

2

Para los usuarios de Windows (Estoy corriendo Python 2.7.2, Win7x64, por defecto paquete de instalación) la llamada a __file__ se la llama como ha señalado @ zjm1126, sospecho que el problema es que itertools es una orden interna en las ventanas paquete. Si eligió decir, exceptions? Obtendrá el mismo comportamiento en otra plataforma (por ejemplo, Python 2.6.1 en mi macbook): Windows tiene unos pocos complementos adicionales como itertools.

no es estrictamente una respuesta como tal, pero se podría analizar sys.modules lo que le daría una pista sobre dónde viene desde:

>>> import sys 
>>> sys.modules['itertools'] 

<module 'itertools' (built-in)> 

que apunta a itertools ser incorporados a su ejecutable pitón.

Además, la respuesta imp.find_module está proporcionando la misma información: la tupla de retorno es raro por espectrometría (ver: http://docs.python.org/2/library/imp.html#imp.find_module) y le dice que el módulo es de tipo 6, que es la enumeración de imp.C_BUILTIN

Cuestiones relacionadas