How can I turn off color in ipdb? - ipdb

When I embed the code ina python script
import ipdb; ipdb.set_trace()
the colors clash with default Xterm color scheme

Old answer - insert this into code (2019, doesn't work):
import ipdb; ipdb.def_colors='NoColor'; ipdb.set_trace()
Updated answer based on latest IPython
1 - run at prompt to create default profile:
ipython profile create
2 - edit /your home dir/.ipython/profile_default/ipython_config.py
Add at top
c = get_config()
Then add
c.InteractiveShell.colors = 'NoColor'

Related

how to convert python code into executable file

I have a python code that run perfect now i want to convert this code into an executable file .I am using python 3.6.
Until now I was able to convert it ,and make it run but the problem is that when the user try to run the .exe file cmd window is opened.
how can I make the cmd window to be hidden OR to not show?
the code below is to create the build folder that includes the converted executable file.
setup.py
import cx_Freeze
import sys
import os
import matplotlib
#os.environ['TCL_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6"
#os.environ['TK_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tk8.6"
os.environ['TCL_LIBRARY'] = "C:\\EXECUTABLE_PROGRAMS\\Python3.6\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\EXECUTABLE_PROGRAMS\\Python3.6\\tcl\\tk8.6"
base = None
if sys.platform == 'win32':
base='Win32GUI'
executables = [cx_Freeze.Executable("myPDFviewer.py",base=None)]
cx_Freeze.setup(
name = "this is a test",
options = {"build_exe": {"packages":["numpy"],}},
version = "0.01",
descriptions = "Trying to get this to work",
executables = executables
)
Change base=None to base="Win32GUI"

How to clear cache (or force recompilation) in numba

I have a fairly large codebase written in numba, and I have noticed that when the cache is enabled for a function calling another numba compiled function in another file, changes in the called function are not picked up when the called function is changed. The situation occurs when I have two files:
testfile2:
import numba
#numba.njit(cache=True)
def function1(x):
return x * 10
testfile:
import numba
from tests import file1
#numba.njit(cache=True)
def function2(x, y):
return y + file1.function1(x)
If in a jupyter notebook, I run the following:
# INSIDE JUPYTER NOTEBOOK
import sys
sys.path.insert(1, "path/to/files/")
from tests import testfile
testfile.function2(3, 4)
>>> 34 # good value
However, if I change then change testfile2 to the following:
import numba
#numba.njit(cache=True)
def function1(x):
return x * 1
Then I restart the jupyter notebook kernel and rerun the notebook, I get the following
import sys
sys.path.insert(1, "path/to/files/")
from tests import testfile
testfile.function2(3, 4)
>>> 34 # bad value, should be 7
Importing both files into the notebook has no effect on the bad result. Also, setting cache=False only on function1 also has no effect. What does work is setting cache=False on all njit'ted functions, then restarting the kernel, then rerunning.
I believe that LLVM is probably inlining some of the called functions and then never checking them again.
I looked in the source and discovered there is a method that returns the cache object numba.caching.NullCache(), instantiated a cache object and ran the following:
cache = numba.caching.NullCache()
cache.flush()
Unfortunately that appears to have no effect.
Is there a numba environment setting, or another way I can manually clear all cached functions within a conda env? Or am I simply doing something wrong?
I am running numba 0.33 with Anaconda Python 3.6 on Mac OS X 10.12.3.
I "solved" this with a hack solution after seeing Josh's answer, by creating a utility in the project method to kill off the cache.
There is probably a better way, but this works. I'm leaving the question open in case someone has a less hacky way of doing this.
import os
def kill_files(folder):
for the_file in os.listdir(folder):
file_path = os.path.join(folder, the_file)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
except Exception as e:
print("failed on filepath: %s" % file_path)
def kill_numba_cache():
root_folder = os.path.realpath(__file__ + "/../../")
for root, dirnames, filenames in os.walk(root_folder):
for dirname in dirnames:
if dirname == "__pycache__":
try:
kill_files(root + "/" + dirname)
except Exception as e:
print("failed on %s", root)
This is a bit of a hack, but it's something I've used before. If you put this function in the top-level of where your numba functions are (for this example, in testfile), it should recompile everything:
import inspect
import sys
def recompile_nb_code():
this_module = sys.modules[__name__]
module_members = inspect.getmembers(this_module)
for member_name, member in module_members:
if hasattr(member, 'recompile') and hasattr(member, 'inspect_llvm'):
member.recompile()
and then call it from your jupyter notebook when you want to force a recompile. The caveat is that it only works on files in the module where this function is located and their dependencies. There might be another way to generalize it.

Color change in PyShell python does not work for me

I am new to programming so i apologise for stupid questions. I am using Python 3.5.2 on windows.
I am trying to print color in my pyShell, because as a newbee, thats where i learned to code in...i dont understand why all the examples on youtube are on windows command prompt
Anyway, I installed colorama
Code:
from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')
and on my PyShell i get...strange characters and code all in blue.
For example:
[31msome red text
[42mand with a green background
[2mand in dim text
[0m
back to normal now
PLEASE HELP OR I WILL BRAKE MY PC.
..thanks...lol
You need to initialise Colorama using:
from colorama import init
init()
And everything works fine for your code.

How can I modify locals in Python 2.6's pdb?

How can I modify local variables in pdb or ipdb? These debuggers effectively ignore changes to existing local bindings, e.g. here's an example using ipython.
In [3]: def foo():
...: bar = 123
...: import ipdb; ipdb.set_trace()
...: print bar
...:
In [4]: foo()
> <ipython-input-3-ee9873383395>(4)foo()
3 import ipdb; ipdb.set_trace()
----> 4 print bar
5
ipdb> del bar # effect is limited too the current line
ipdb> bar # bar is still bound to the old value
123
ipdb> del bar; print bar # shows it worked within the line
<function bar at 0x2b7e488>
ipdb> print bar # but the effect goes away on the next debugger line
123
ipdb> c # confirmation that the binding wasn't changed
123
Note that directly modifying locals() has no effect either.
In case it matters, I'm using Python 2.6.
Background: I'm trying to debug some destructor issues and want to more explicitly control when each local is deleted to track down my bug.
EDIT: gave a complete standalone example.
EDIT 2: This is at least partially fixed in Python 2.7. Any solutions for Python 2.6 would still be appreciated.

Win32com Save PDF to XML with Acrobat Pro X > com_error "-2147467263, 'Not implemented'" [duplicate]

This question already has answers here:
"Not implemented" Exception when using pywin32 to control Adobe Acrobat
(2 answers)
Closed 6 years ago.
Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
Windows XP SP3
Python 2.7 pywin32-218
Adobe Acrobat X 10.0.0
I want to use Python to automate Acrobat Pro to export a PDF to XML. I already tried it manually using the 'Save As' dialog box from the running program and now want to do it via a Python script. I have read many pages including parts of the Adobe SDK, SDK Forum, VB Forums and am having no luck.
I read Blish's problem here: "Not implemented" Exception when using pywin32 to control Adobe Acrobat
And this page: timgolden python/win32_how_do_i/generate-a-static-com-proxy.html
I am missing something. My code is:
import win32com.client
import win32com.client.makepy
win32com.client.makepy.GenerateFromTypeLibSpec('Acrobat')
adobe = win32com.client.DispatchEx('AcroExch.App')
avDoc = win32com.client.DispatchEx('AcroExch.AVDoc')
avDoc.Open('C:\Documents and Settings\PC\Desktop\a_PDF.pdf', 'C:\Documents and Settings\PC\Desktop')
pdDoc = avDoc.GetPDDoc()
jObject = pdDoc.GetJSObject()
jObject.SaveAs('C:\Documents and Settings\PC\Desktop\a_PDF.xml', "com.adobe.acrobat.xml-1-00")
The full error is:
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
jObject.SaveAs('C:\Documents and Settings\PC\Desktop\a_PDF.xml', "com.adobe.acrobat.xml-1-00")
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 511, in __getattr__
ret = self._oleobj_.Invoke(retEntry.dispid,0,invoke_type,1)
com_error: (-2147467263, 'Not implemented', None, None)
I'm guessing it has to do with make.py but I don't understand how to implement it in my code.
I pulled this line from my code and got the same error when I ran it:
win32com.client.makepy.GenerateFromTypeLibSpec('Acrobat')
I then changed these two lines from 'DispatchEX' to 'Dispatch' and same error:
adobe = win32com.client.Dispatch('AcroExch.App')
avDoc = win32com.client.Dispatch('AcroExch.AVDoc')
When I run the Dispatches by themselves and then call them back I get:
>>> adobe = win32com.client.DispatchEx('AcroExch.App')
>>> adobe
<win32com.gen_py.Adobe Acrobat 10.0 Type Library.CAcroApp instance at 0x18787784>
>>> avDoc = win32com.client.Dispatch('AcroExch.AVDoc')
>>> avDoc
<win32com.gen_py.Adobe Acrobat 10.0 Type Library.CAcroAVDoc instance at 0x20365224>
Does this mean I should make only one call to Dispatch? I pulled:
adobe = win32com.client.Dispatch('AcroExch.App')
and got the same error.
This Adobe site says:
AVDoc
Product availability: Acrobat, Reader
Platform availability: Macintosh, Windows, UNIX
Syntax
typedef struct _t_AVDoc* AVDoc;
A view of a PDF document in a window. There is one AVDoc per displayed document. Unlike a PDDoc, an AVDoc has a window associated with it.
acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/API_References/Acrobat_API_Reference/AV_Layer/AVDoc.html#AVDocSaveParams
The PDDoc page says:
A PDDoc object represents a PDF document. There is a correspondence between a PDDoc and an ASFile. Also, every AVDoc has an associated PDDoc, although a PDDoc may not be associated with an AVDoc.
/9.1/Acrobat9_1_HTMLHelp/API_References/Acrobat_API_Reference/PD_Layer/PDDoc.html
I tried the following code and also got the same error:
import win32com.client
import win32com.client.makepy
pdDoc = win32com.client.Dispatch('AcroExch.PDDoc')
pdDoc.Open('C:\Documents and Settings\PC\Desktop\a_PDF.pdf')
jObject = pdDoc.GetJSObject()
jObject.SaveAs('C:\Documents and Settings\PC\Desktop\a_PDF.xml', "com.adobe.acrobat.xml-1-00")
Same error if I change:
pdDoc = win32com.client.Dispatch('AcroExch.PDDoc')
to
pdDoc = win32com.client.gencache.EnsureDispatch('AcroExch.PDDoc')
like here: win32com.client.Dispatch works but not win32com.client.gencache.EnsureDispatch
user2993272, you were almost there: just one more line and the code you have should have worked flawlessly.
I'm going to attempt to answer in the same spirit as your question and provide you as much details as I can.
This thread holds the key to the solution you are looking for: https://mail.python.org/pipermail/python-win32/2002-March/000260.html
I admit that the post is not the easiest to find (perhaps Google scores it low based on the age of the content?).
Specifically, applying this piece of advice will get things running for you: https://mail.python.org/pipermail/python-win32/2002-March/000265.html
For completeness, this piece of code should get the job done and not require you to manually patch dynamic.py (snippet should run pretty much out of the box):
# gets all files under ROOT_INPUT_PATH with FILE_EXTENSION and tries to extract text from them into ROOT_OUTPUT_PATH with same filename as the input file but with INPUT_FILE_EXTENSION replaced by OUTPUT_FILE_EXTENSION
from win32com.client import Dispatch
from win32com.client.dynamic import ERRORS_BAD_CONTEXT
import winerror
# try importing scandir and if found, use it as it's a few magnitudes of an order faster than stock os.walk
try:
from scandir import walk
except ImportError:
from os import walk
import fnmatch
import sys
import os
ROOT_INPUT_PATH = None
ROOT_OUTPUT_PATH = None
INPUT_FILE_EXTENSION = "*.pdf"
OUTPUT_FILE_EXTENSION = ".txt"
def acrobat_extract_text(f_path, f_path_out, f_basename, f_ext):
avDoc = Dispatch("AcroExch.AVDoc") # Connect to Adobe Acrobat
# Open the input file (as a pdf)
ret = avDoc.Open(f_path, f_path)
assert(ret) # FIXME: Documentation says "-1 if the file was opened successfully, 0 otherwise", but this is a bool in practise?
pdDoc = avDoc.GetPDDoc()
dst = os.path.join(f_path_out, ''.join((f_basename, f_ext)))
# Adobe documentation says "For that reason, you must rely on the documentation to know what functionality is available through the JSObject interface. For details, see the JavaScript for Acrobat API Reference"
jsObject = pdDoc.GetJSObject()
# Here you can save as many other types by using, for instance: "com.adobe.acrobat.xml"
jsObject.SaveAs(dst, "com.adobe.acrobat.accesstext")
pdDoc.Close()
avDoc.Close(True) # We want this to close Acrobat, as otherwise Acrobat is going to refuse processing any further files after a certain threshold of open files are reached (for example 50 PDFs)
del pdDoc
if __name__ == "__main__":
assert(5 == len(sys.argv)), sys.argv # <script name>, <script_file_input_path>, <script_file_input_extension>, <script_file_output_path>, <script_file_output_extension>
#$ python get.txt.from.multiple.pdf.py 'C:\input' '*.pdf' 'C:\output' '.txt'
ROOT_INPUT_PATH = sys.argv[1]
INPUT_FILE_EXTENSION = sys.argv[2]
ROOT_OUTPUT_PATH = sys.argv[3]
OUTPUT_FILE_EXTENSION = sys.argv[4]
# tuples are of schema (path_to_file, filename)
matching_files = ((os.path.join(_root, filename), os.path.splitext(filename)[0]) for _root, _dirs, _files in walk(ROOT_INPUT_PATH) for filename in fnmatch.filter(_files, INPUT_FILE_EXTENSION))
# Magic piece of code that should get everything working for you!
# patch ERRORS_BAD_CONTEXT as per https://mail.python.org/pipermail/python-win32/2002-March/000265.html
global ERRORS_BAD_CONTEXT
ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)
for filename_with_path, filename_without_extension in matching_files:
print "Processing '{}'".format(filename_without_extension)
acrobat_extract_text(filename_with_path, ROOT_OUTPUT_PATH, filename_without_extension, OUTPUT_FILE_EXTENSION)
I have tested this on WinPython x64 2.7.6.3, Acrobat X Pro

Resources