ChatGPT解决这个技术问题 Extra ChatGPT

Create a PyCharm configuration that runs a module a la "python -m foo"

My python entrypoint needs to be run as a module (not a script), as in:

python -m foo.bar

The following does not work (and is not supposed to):

python foo/bar.py

How can I create a run confirguration in pycharm that runs my code using the first invokation above?

Discussion on JetBrains support forum: intellij-support.jetbrains.com/hc/en-us/community/posts/…
There is now a better answer that would probably help more people if accepted.

c
codeape

In 2018.1 it is finally possible to specify the module name instead of the script path in the UI. There is a dropdown for changing it, to the left of the input field.

https://i.stack.imgur.com/yLDiy.png


This should be the accepted answer. @alexflint I suggest you change the accepted answer.
J
J. R. Petrus

There is a workaround I use for my scripts, which do use relative imports.

python -m actually invokes a script called runpy.py which is part of a standard Python installation. These two invocations are equivalent:

python -m my_module.a.b module_arguments
python python_lib_directory/runpy.py my_module.a.b module_arguments

Use the latter method to setup your Run/Debug Configuration:

Script: python_lib_directory/runpy.py

Script parameters: my_module.a.b module_arguments

Interpreter options: (leave blank, no -m required)


Great trick, this also enables you to use the profiling option of pycharm !
This still wouldn't work for me. I still got the error: couln't find module. Can it have something to do with the fact that I'm using Conda to manage environments (including PyCharm)?
For PyCharm 2017.3.2 (Professional Edition), @andrewdotn's answer can work for Run but not for Debug. You answer can work for both Run and Debug.
In my Ubuntu installation, the script is located there: ./usr/lib/python*/runpy.py
What if I want to debug algo2.py? C:\Python36\Scripts\pylivetrader.exe run algo2.py
a
andrewdotn

According to man python, the -m option

-m module-name Searches sys.path for the named module and runs the corresponding .py file as a script.

So most of the time you can just right-click on bar.py in the Project tool window and select Run bar.

If you really need to use the -m option, then specify it as an Interpreter option, with the module name as the Script in the Edit Configurations dialog:

https://i.stack.imgur.com/fR2qd.png


This doesn't work because I'm using "from future import absolute_import" and then later I do "from . import foo".
Oh, ok. I’ve updated the answer to handle that case.
Any chance of running this from a remote interpreter?
That worked for running the module, but not when debugging it. If I click the debug icon instead of the run icon, I get the error No module found.
This works when just running the application. Profiling however fails with a "Import by filename is not supported." In order to get profiling to work you need the 'runpy.py' trick below
A
Anton Tarasenko

IntelliJ IDEA / PyCharm 2017

Field "Script" is optional in the recent versions of JetBrains IDEs. Specifying -m foo.bar in "Script parameters" is enough:

https://i.stack.imgur.com/oxavt.png


Thanks! That's a great update. This should be the new accepted answer.
Doesn't seem to work in PyCharm 2017.3.1 (Professional Edition), apparently because PyCharm actually calls /Applications/PyCharm.app/Contents/helpers/pydev/pydevd.py with lots of options, including --file XXX which it sees as --file -m using your solution.
A
Amnon Grossman

In PyCharm 2016 specifying -m without a script path doesn't work, as they use a wrapper script that doesn't accept the -m argument.

Here's my solution, which works for run & debug configurations: https://github.com/amnong/misc/tree/master/pycharm_runner

Edit: I just read J. R. Petrus's comment, and my solution is very similar. BTW I also tried to support proper entry points using pkg_resources, but for some reason pkg_resources.load_entry_point() could not find my project's distribution...