-
-
Notifications
You must be signed in to change notification settings - Fork 32.4k
gh-132737: Support profiling modules that import __main___ #132738
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 1 commit
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
b4f3934
Support profiling modules that import __main___
aneeshdurg e068bea
📜🤖 Added by blurb_it.
blurb-it[bot] ca66a0e
replace __main__'s namespace instead of creating a new module
aneeshdurg 1c621a0
Update Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-18-07-34.gh-issu…
aneeshdurg 923cb6e
quote __main__ and fix typo
aneeshdurg 75a542e
Add regression test
aneeshdurg 3665a7f
Only modify __main__ in CLI invocation
aneeshdurg e6d50bd
Avoid leaking cProfile scope into profiled code
aneeshdurg 5607cb8
Remove unused import
aneeshdurg 8d6f37b
Undo changes to module execution
aneeshdurg 191445c
Revert quote change
aneeshdurg 2fffb33
less hacky
aneeshdurg 8f9b8a1
Remove unecessary inclusion of __builtins__ to globals
aneeshdurg 226d78d
Requested test changes
aneeshdurg 15d8674
Update Misc/NEWS.d/next/Core_and_Builtins/2025-04-19-18-07-34.gh-issu…
aneeshdurg File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Only modify __main__ in CLI invocation
- Loading branch information
commit 3665a7f3f676b6f9abe477a680c507d019c9f0bd
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do you need to restore it? You are exiting the program anyway. Also this is not ideal either. This will include all the global variables to the script that is being profiled. We want
print(locals())
to be basically the same with or without the profiler.Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The issue is to juggle the global variables needed by the call to (and implementation of) runctx. It would be a lot easier if I could split cprofile into a module where
__main__
only has the main function. Is that something I can do?if not, it's still possible, just trickier/messier.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No you can't split it into its own module :( that's too much a change. I think the correct way to go is to make the full
runctx
path independent of any global variables.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Found a much cleaner fix - just ensure that the "main" function isn't run in the
__main__
namespace.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I'm not sure if this is too hacky. I did not find such pattern in other code. It looks like an acceptable solution but I don't know if there will be implications. I want to ask @vstinner about this as he probably knows a lot of interesting usages.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like this hack works as expected. But it's strange and surprising :-)
I tried but failed (test fails) to inject a new
__main__
module insys.modules
and leave the cProfile module unchanged:Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't this hack what pdb already does implicitly?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cpython/Lib/pdb.py
Line 2449 in de9deb7
Ah, it's actually explicitly documented
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@vstinner @gaogaotiantian I did a bit more poking around and I think I managed to get rid of any of the hacky-ness. cProfile's main remains untouched, and in the case where we execute a file, I create a new module, set it as main, and ensure that the globals dict is the dict of the new module. The tests pass.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the current solution looks much less hacky.