Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to know if python script was run using interpreter's -m option?

I couldn't find answer after having read all the following:

  • PEP 338 Executing modules as scripts
  • documentation of runpy standard module
  • description of Python interpreter's -m option

Rationale:
When a test script which uses relative imports is being run without -m option I could print a warning message instead of leaving user with standard traceback leading to ValueError: Attempted relative import in non-package exception. Without knowing this I can catch this exception and only suggest lack of -m option could be the reason of error.

like image 206
Piotr Dobrogost Avatar asked Dec 01 '11 21:12

Piotr Dobrogost


2 Answers

Disclaimer: this is just an observation, I have not seen it in the docs so it is probably implementation dependent and might not be consistent across different Python versions.

I have noticed that when calling a script using a -m option a variable called __loader__ is added to the namespace, so at the top of your script you could check for existence of that variable:

if '__loader__' in globals():
    # called with -m

For some extra safety you could check to see if __loader__ is an instance of pkgutil.ImpLoader:

if '__loader__' in globals() and __loader__.__class__.__name__ == 'ImpLoader':
like image 54
Andrew Clark Avatar answered Oct 16 '22 12:10

Andrew Clark


Another observation is that __package__ is set to None when executing the script directly and to the package name when using -m (using the empty string when the module isn't included in any package, so it's still different from None).

like image 32
jcollado Avatar answered Oct 16 '22 12:10

jcollado