从命令行(终端)启动Pycharm

113

我想尝试使用PyCharm进行Sage数学开发。通常我使用Eclipse进行Sage开发,但现在我想用PyCharm试试。

为了使用Sage环境变量启动Eclipse,在命令行中我通常会执行以下操作:

sage -sh
cd /path/to/eclipse
./eclipse

第一行加载sage环境变量,其余部分启动eclipse。如何在pyCharm中实现相同的功能?(注意,我在Mac和Ubuntu上使用sage进行开发;上述命令与两个操作系统都兼容)
1. 链接1 接近我正在寻找的解决方案,但我无法找到任何 pyCharm.sh 文件。
2. 链接2:Jetbrains也没有给出清晰的说明。

3
在 MacOS 中,你可以通过输入 "charm" 来启动 PyCharm,这与 Yonathan Simson 在 Ubuntu 中提到的行为相同。 - cndv
3
JeBrains没有提供如何做到这一点的说明,即便是两年后。这意味着,使用PyCharm来运行仅限sudo的脚本(例如鼠标钩子)并没有得到JB很好的记录。我并不感到印象深刻。 - code4life
4
有人知道2019年在Windows上如何做这件事吗? - Jesse Reza Khorasanee
23个回答

274

编辑(2020年4月):看起来现在工具箱应用程序设置中管理启动器脚本的创建。 有关更多详细信息,请参见Toolbox App公告

--

  1. 打开应用程序Pycharm
  2. 在菜单栏中找到“工具”
  3. 点击创建命令行启动器
  4. 检查已经创建的启动器可执行文件,位于/usr/local/bin/charm
  5. 打开项目或文件,只需键入$ charm YOUR_FOLDER_OR_FILE

也许这就是你需要的。


4
这很棒,因为你也可以打开文件或目录。 - JnBrymn
9
原文:It turns out that by default on ubuntu you already have this file /usr/local/bin/charm. Though I could not have found it easily without your tip. Thanks!翻译:原来在ubuntu上,默认情况下已经安装了该文件/usr/local/bin/charm。虽然如果没有您的提示,我可能很难找到它。谢谢! - Yonatan Simson
2
注意,OSX在安装时也创建了charm二进制文件。太棒了! - AdelaN
2
这在2019.1 EAP中已经消失了。 - episodeyang
1
@episodeyang 你说得对,参见 https://blog.jetbrains.com/blog/2018/08/23/toolbox-app-1-11-whats-new/。我会相应地修改我的答案。 - botenvouwer
显示剩余7条评论

25

您说得对,JetBrains 帮助页面 不是很清晰。在 OS X 上,您需要使用以下启动器:

/Applications/PyCharm.app/Contents/MacOS/pycharm

或者,对于社区版:

/Applications/PyCharm\ CE.app/Contents/MacOS/pycharm

不幸的是,为这个二进制文件添加符号链接对我没用(启动器会崩溃)。不过设置别名可以解决问题。在你的.bash_profile中添加以下内容(或者你使用的任何其他shell):

alias pycharm="/Applications/PyCharm CE.app/Contents/MacOS/pycharm"

然后,您只需使用 pycharm 命令即可运行命令。

有了这个,您可以像打开项目一样完成各种操作:

pycharm ~/repos/my-project

或者在项目中打开文件的特定行:

pycharm ~/repos/my-project --line 42 ~/repos/my-project/script.py

或查看两个文件的差异(它们不必是项目的一部分):

pycharm ~/some_file.txt ~/Downloads/some_other_file.txt

请注意,我需要传递这些文件的绝对路径,否则PyCharm无法找到它们。


1
看起来您也可以使用以下命令将目录作为项目打开:/Applications/PyCharm\ CE.app/Contents/MacOS/pycharm /path/to/folder - Henry
我试了一下你的命令。但是我不得不在Pycharm和CE.app之间加上一个斜杠才能让它正常工作。alias pycharm="/Applications/PyCharm\ CE.app/Contents/MacOS/pycharm" - Quimbo

23

在IDE中,您可以点击:

工具/创建命令行启动器...

创建命令行启动器


4
正如 @Ami Mahloof 的回答所指出的,可能需要在 PyCharm 更新后重新创建此启动器(对我而言是这种情况,PyCharm 可以启动但没有打开给定路径)。 - Florentin Le Moal

13

macOS

无需任何路径的简易解决方案:

open -b com.jetbrains.pycharm <file>



您可以将其设置为别名,以便更轻松地每天使用(放到您的~/.bash_rc等):

alias pycharm='open -b com.jetbrains.pycharm'

使用方法:

# open current dir:
pycharm .
# open a file:
pycharm file.py

1
稍微简短一些:打开 PyCharm <文件> - solvingJ

11

更新

现在可以从JetBrains Toolbox自动创建命令行启动器。以下是操作步骤:

  1. 打开Toolbox窗口;
  2. 进入右上角的齿轮图标(Toolbox本身的设置窗口);
  3. 打开生成shell脚本
  4. Shell脚本位置文本框中填写您想要启动器存放的位置。目前必须手动填写,不会自动填充!

在Mac上,位置可能是/usr/local/bin。对于新手,您可以使用PATH变量内的任何路径或在bash配置文件中添加新路径到PATH变量。使用echo $PATH查看有哪些路径。

注意!对我而言,它并没有立即起作用,我需要稍微调整一下才能生成脚本。您可以转到IDEA(例如PyCharm)的齿轮图标以查看/更改启动器名称。因此,对于PyCharm,默认名称为pycharm,但您可以将其更改为任何您喜欢的名称。

原始回答

如果您不使用Toolbox,仍然可以使用我的原始回答。

~~由于现在已成为JetBrains Toolbox的一部分,因此在2019.1中不再提供创建命令行启动器选项。~~

以下是您自己创建脚本的方法:

如果您之前已经使用过charm命令,请使用type -a charm查找脚本。更改文件路径中的pycharm版本。请注意,第一个变量RUN_PATH中的编号是不同的。您需要自己在目录中查找。
RUN_PATH = u'/Users/boatfolder/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/191.6183.50/PyCharm.app'
CONFIG_PATH = u'/Users/boatfolder/Library/Preferences/PyCharm2019.1'
SYSTEM_PATH = u'/Users/boatfolder/Library/Caches/PyCharm2019.1'

如果您以前没有使用过charm命令,则需要创建它。

将charm文件创建在类似这样的位置:/usr/local/bin/charm

然后添加此代码(根据上面的说明更改版本号):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import struct
import sys
import os
import time

# see com.intellij.idea.SocketLock for the server side of this interface

RUN_PATH = u'/Users/boatfolder/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/191.6183.50/PyCharm.app'
CONFIG_PATH = u'/Users/boatfolder/Library/Preferences/PyCharm2019.1'
SYSTEM_PATH = u'/Users/boatfolder/Library/Caches/PyCharm2019.1'


def print_usage(cmd):
    print(('Usage:\n' +
           '  {0} -h | -? | --help\n' +
           '  {0} [project_dir]\n' +
           '  {0} [-l|--line line] [project_dir|--temp-project] file[:line]\n' +
           '  {0} diff <left> <right>\n' +
           '  {0} merge <local> <remote> [base] <merged>').format(cmd))


def process_args(argv):
    args = []

    skip_next = False
    for i, arg in enumerate(argv[1:]):
        if arg == '-h' or arg == '-?' or arg == '--help':
            print_usage(argv[0])
            exit(0)
        elif i == 0 and (arg == 'diff' or arg == 'merge' or arg == '--temp-project'):
            args.append(arg)
        elif arg == '-l' or arg == '--line':
            args.append(arg)
            skip_next = True
        elif skip_next:
            args.append(arg)
            skip_next = False
        else:
            path = arg
            if ':' in arg:
                file_path, line_number = arg.rsplit(':', 1)
                if line_number.isdigit():
                    args.append('-l')
                    args.append(line_number)
                    path = file_path
            args.append(os.path.abspath(path))

    return args


def try_activate_instance(args):
    port_path = os.path.join(CONFIG_PATH, 'port')
    token_path = os.path.join(SYSTEM_PATH, 'token')
    if not (os.path.exists(port_path) and os.path.exists(token_path)):
        return False

    try:
        with open(port_path) as pf:
            port = int(pf.read())
        with open(token_path) as tf:
            token = tf.read()
    except (ValueError):
        return False

    s = socket.socket()
    s.settimeout(0.3)
    try:
        s.connect(('127.0.0.1', port))
    except (socket.error, IOError):
        return False

    found = False
    while True:
        try:
            path_len = struct.unpack('>h', s.recv(2))[0]
            path = s.recv(path_len).decode('utf-8')
            if os.path.abspath(path) == os.path.abspath(CONFIG_PATH):
                found = True
                break
        except (socket.error, IOError):
            return False

    if found:
        cmd = 'activate ' + token + '\0' + os.getcwd() + '\0' + '\0'.join(args)
        if sys.version_info.major >= 3: cmd = cmd.encode('utf-8')
        encoded = struct.pack('>h', len(cmd)) + cmd
        s.send(encoded)
        time.sleep(0.5)  # don't close the socket immediately
        return True

    return False


def start_new_instance(args):
    if sys.platform == 'darwin':
        if len(args) > 0:
            args.insert(0, '--args')
        os.execvp('/usr/bin/open', ['-a', RUN_PATH] + args)
    else:
        bin_file = os.path.split(RUN_PATH)[1]
        os.execv(RUN_PATH, [bin_file] + args)


ide_args = process_args(sys.argv)
if not try_activate_instance(ide_args):
    start_new_instance(ide_args)

10

我通常使用OS X内置的应用程序启动器(open)来创建别名:

alias pc='open -a /Applications/PyCharm\ CE.app'

然后我可以输入:

pc myfile1.txt myfiles*.py

虽然你不能(轻松地)向PyCharm传递参数,但如果你想快速打开文件(而不需要使用完整的文件路径),这个方法可以解决问题。


6

使用 工具 -> 创建命令行启动器,将安装一个Python脚本,您可以只需使用charm打开当前工作文件夹。

非常重要!

每次升级pyCharm时,都必须重新创建该命令行工具,因为它只是指向pyCharm配置的Python脚本可能过期,并在尝试运行 charm . 时导致失败。


事实上,每次我更新PyCharm时都需要重新创建启动器才能让它再次工作。 - tsando
我喜欢有一个命令行启动器,但我想这就是让工具箱为您完成的优点! - Drew

3

在Ubuntu 16.04中,要从终端打开PyCharm,请先进入以下目录:

{installation home}/bin

在我的情况下是

/home/nikhil/pycharm-community-2018.1.1/bin/

然后输入:

./pycharm.sh

3

在Mac OSX上

更新2019/05:现在可以在JetBrains Toolbox应用程序中完成此操作。您可以使用Toolbox一次设置所有JetBrain IDE。


截至2019.1 EAP创建命令行启动器选项不再在工具菜单中提供。我的解决方案是在我的bash/zsh配置文件中使用以下别名:

确保您运行chmod -x ...../pycharm以使二进制文件可执行。

最初的回答

如果您无法在Tools菜单中找到Create Command Line Launcher选项,则可以在bash/zsh配置文件中使用别名来解决问题。另外,请务必记得运行chmod -x ...../pycharm以使二进制文件可执行。

# in your ~/.profile or other rc file to the effect.

alias pycharm="open -a '$(ls -r /Users/geyang/Library/Application\ Support/JetBrains/Toolbox/apps/PyCharm-P/**/PyCharm*.app/Contents/MacOS/pycharm)'"

2019.1版本的发布版再次具有“创建命令行启动器”菜单项。 - rholmes

2

在终端中导航到目录 cd [你的目录]

在终端中导航到目录

使用 charm . 打开 PyCharm 中的项目

在 PyCharm 中打开项目的最简单和最快捷的方式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接