pycallgraph icon indicating copy to clipboard operation
pycallgraph copied to clipboard

pycallgraph executable not created on install

Open roger-butler opened this issue 12 years ago • 11 comments

I downloaded pycallgraph 1.0.1 and untarred it into a temporary directory. My Python environment is Enthought Canopy 1.1 on Windows 7. I ran easy_install pip to install pip, then pip install pycallgraph. Files were copied to my Python environment but not an executable. So I can run pycallgraph using the API but not the command line.

Any ideas?

roger-butler avatar Oct 31 '13 03:10 roger-butler

Hi @roger-butler

I have not tested pycallgraph on Windows so you'll have to excuse it not working first go :)

Can you print out the log out of of the pip install pycallgraph so we can see where the pycallgraph script was installed to?

From a quick Google, it seems that the script would have to be renamed to pycallgraph.py, and only then Windows will recognise it (due to file association). Obviously it would also need to be in your path, or executed with the correct path components.

I'll leave this ticket open to ensure the script is installed in Windows correctly.

gak avatar Oct 31 '13 04:10 gak

Hello Gerald,

Thanks for helping with this.

My path contains C:\Users\rbutler\AppData\Local\Enthought\Canopy\User;C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\Scripts.

C:\Users\rbutler>pip install pycallgraph Requirement already satisfied (use --upgrade to upgrade): pycallgraph in c:\user s\rbutler\appdata\local\enthought\canopy\user\lib\site-packages\pycallgraph-1.0. 1-py2.7.egg Cleaning up...

The contents of pycallgraph-1.0.1-py2.7.egg are:

├───EGG-INFO
│   │   dependency_links.txt
│   │   not-zip-safe
│   │   PKG-INFO
│   │   SOURCES.txt
│   │   top_level.txt
│   │   
│   └───scripts
│           pycallgraph
│           
└───pycallgraph
    │   color.py
    │   color.pyc
    │   config.py
    │   config.pyc
    │   exceptions.py
    │   exceptions.pyc
    │   globbing_filter.py
    │   globbing_filter.pyc
    │   memory_profiler.py
    │   memory_profiler.pyc
    │   metadata.py
    │   metadata.pyc
    │   pycallgraph.py
    │   pycallgraph.pyc
    │   tracer.py
    │   tracer.pyc
    │   util.py
    │   util.pyc
    │   __init__.py
    │   __init__.pyc
    │   
    └───output
            gephi.py
            gephi.pyc
            graphviz.py
            graphviz.py.old
            graphviz.pyc
            output.py
            output.pyc
            pickle.py
            pickle.pyc
            ubigraph.py
            ubigraph.pyc
            __init__.py
            __init__.pyc

An EASY-INSTALL file pycallgraph was also installed into C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\Scripts. I have renamed this file to pycallgraph.py but still can't call it:

C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\Scripts>python pycallgraph
Traceback (most recent call last):
  File "pycallgraph", line 5, in <module>
    pkg_resources.run_script('pycallgraph==1.0.1', 'pycallgraph.py')
  File "C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\lib\site-packages\pkg_resources.py", line 499, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\lib\site-packages\pkg_resources.py", line 1239, in run_script
    execfile(script_filename, namespace, namespace)
  File "c:\users\rbutler\appdata\local\enthought\canopy\user\lib\site-packages\pycallgraph-1.0.1-py2.7.egg\EGG-INFO\scripts\pycallgraph.py", line 11, in <module>
    import pycallgraph as __pycallgraph
  File "C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\Scripts\pycallgraph.py", line 5, in <module>
    pkg_resources.run_script('pycallgraph==1.0.1', 'pycallgraph.py')
  File "C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\lib\site-packages\pkg_resources.py", line 499, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "C:\Users\rbutler\AppData\Local\Enthought\Canopy\User\lib\site-packages\pkg_resources.py", line 1239, in run_script
    execfile(script_filename, namespace, namespace)
  File "c:\users\rbutler\appdata\local\enthought\canopy\user\lib\site-packages\pycallgraph-1.0.1-py2.7.egg\EGG-INFO\scripts\pycallgraph.py", line 17, in <module>
    __config = __pycallgraph.Config()
AttributeError: 'module' object has no attribute 'Config'

Other modules such as pip tend to have Windows executables in the Scripts directory, e.g. pip.exe. Sorry, I don't know enough about Python installation to help much more.

Regards, Roger.

roger-butler avatar Nov 01 '13 02:11 roger-butler

@roger-butler Without having a computer to test on, it appears that the pycallgraph script it somehow importing itself instead of the main module. You can see the initial script finding and executing scripts\pycallgraph.py, but then when it tries to import the main pycallgraph module (which should be in pycallgraph not scripts), it imports the same scripts\pycallgraph.py file again.

Unfortunately not sure I can easily debug/fix this for you remotely, so I'll keep it open for fixing in the future.

I can only suggest to work out why it's calling itself instead of the correct module. I'm not sure what Enthought Canopy does different with Python, but it could be a possibility that it has something to do with it. Maybe try a standard Python install to see if it has the same problem.

gak avatar Nov 01 '13 04:11 gak

Epydoc has a similar situation where their executable script epydoc needs to be renamed to epydoc.py inside of C:\Python27\Scripts. In addition, the script name has the same label as the Epydoc package, which would cause conflicts. But they dealt with this issue by removing the script from the Python path before importing the Epydoc package.

Following their example, I was able to get Python Call Graph to work on Windows by modifying this snippet in the executable pycallgraph.py script, just before it imports the pycallgraph package:

import sys
import os

# ----- INSERT -----
# Remove the directory containing pycallgraph.py from the Python search path
sys.path = [p for p in sys.path
            if not os.path.exists(os.path.join(p, 'pycallgraph.py'))]
# ------------------

import pycallgraph as __pycallgraph

Tibbar49 avatar Mar 04 '14 20:03 Tibbar49

Hey Tibbar49, I'm also trying to use pycallgraph on Windows 7. I tried renaming the pycallgraph in the Scripts folder to pycallgraph.py and modifying the code of pycallgraph.h (in lib /sitepackeges directory). Somehow it still does not work. Could you maybe post the whole modiefied code of that file?

eler90 avatar Aug 10 '14 13:08 eler90

You shouldn't need to modify any header (*.h) files.

Since pycallgraph (renamed to pycallgraph.py and modified as noted above) in the C:\Python27\Scripts folder is not an application that Windows can see on the system path, you need to pass the script's full path to the Python executable:

python C:\Python27\Scripts\pycallgraph.py [arguments]

Alternatively, you can import the Python Call Graph package and use its API in your code.

Note: I tweaked the code in the previous comment to more thoroughly delete C:\Python27\Scripts from the Python search path.

Tibbar49 avatar Aug 19 '14 04:08 Tibbar49

I've just installed pycallgraph on Win7 with easy_install pycallgraph and got hit by this issue.

What's missing, is a simple batch file in c:\Python27\Scripts\

Simply create c:\Python27\Scripts\pycallgraph.bat with the following content:

@echo off
rem Use python to execute the python script having the same name as this batch
rem file, but without any extension, located in the same directory as this
rem batch file
python "%~dpn0" %*

jakubczaplicki avatar Oct 16 '14 11:10 jakubczaplicki

Thank you Kuba !

joris255 avatar Mar 10 '15 13:03 joris255

Jakub's solution seems more elegant than mine. I would try his instead.

Tibbar49 avatar Mar 11 '15 06:03 Tibbar49

There is a better solution: pip supports automatic script creation. If setup.py used entry_points instead of scripts, it would create .exe files in Windows.

There would need to be a single entry method in pycallgraph, and this in setup.py:

entry_points={"console_scripts": ["pycallgraph = pycallgraph.pycallgraph:yourentrymethod"]},

suurjaak avatar Mar 17 '15 21:03 suurjaak

Thanks @jakubczaplicki . That worked for me. I'm using Python 3.5 from the Anaconda distribution so I put the new pycallgraph.bat file in a different path (C:\Anaconda3\Scripts\), where pycallgraph (no extension) is located, exactly as you instructed.

avishapiro avatar Jul 05 '16 14:07 avishapiro