How to Install PyCharm on Fedora 44

Install PyCharm on Fedora 44 with JetBrains' Linux tarball. Covers /opt setup, launchers, updates, removal, and first-run setup.

PublishedAuthorJoshua JamesRead time7 minGuide typeFedora

Fedora does not package JetBrains PyCharm in its default DNF repositories, and JetBrains’ Linux download is a tar archive rather than an RPM. To install PyCharm on Fedora Linux without adding snapd or an unofficial wrapper repository, use JetBrains’ standalone archive, place it under /opt, and add a stable pycharm launcher for terminal and desktop use.

The standalone workflow follows JetBrains’ official Linux tarball path for x86_64 and ARM64 systems. JetBrains also documents Toolbox App and Snap installs in the official PyCharm installation guide; use those upstream paths if you want JetBrains’ GUI manager or automatic Snap refreshes instead of a manually managed /opt install.

Install PyCharm on Fedora

This method installs the current unified PyCharm product from JetBrains release metadata. JetBrains’ documentation lists separate Linux tarballs for x86_64 and ARM64 processors, and the helper created here selects the correct archive for your Fedora architecture.

Fedora ArchitectureJetBrains Platform KeyDownloaded ArchiveInstall Owner
x86_64linuxpycharm-<version>.tar.gzStandalone files under /opt
aarch64 or arm64linuxARM64pycharm-<version>-aarch64.tar.gzStandalone files under /opt

The current PyCharm product keeps core IDE features free and starts a Pro trial for paid features when you launch the IDE. You do not need to install a separate Java package because JetBrains Runtime is bundled with the PyCharm archive.

Update Fedora and Install Download Tools

Refresh Fedora before installing a large desktop application, then make sure the commands used by the installer helper are present.

sudo dnf upgrade --refresh
sudo dnf install curl python3 tar gzip coreutils grep sed desktop-file-utils

These commands use sudo for root-owned package and system directory changes. If your account cannot use sudo yet, configure administrator access first with the guide to add a user to sudoers on Fedora.

Optional, but useful on older or customized Fedora desktops: confirm that your system glibc is new enough for current JetBrains IDE builds.

getconf GNU_LIBC_VERSION

Current Fedora releases meet the glibc baseline for PyCharm, but JetBrains’ published system requirements remain the source for vendor-support wording. If the command prints a version older than glibc 2.28, use a newer Fedora release before installing the current PyCharm build.

Create the PyCharm Update Helper

A standalone tarball does not create a DNF package, so updates repeat the same download, checksum, extraction, launcher, and desktop-entry work. Install a small update-pycharm helper once, then use the same command for the first install and future updates. The setup block refuses to overwrite an existing helper with the same name unless it already looks like the PyCharm helper from this workflow.

if [ -e /usr/local/bin/update-pycharm ] && ! grep -q 'download_dir="$HOME/Downloads/pycharm"' /usr/local/bin/update-pycharm 2>/dev/null; then
    printf 'Existing /usr/local/bin/update-pycharm is not this PyCharm helper. Move it before continuing.\n' >&2
else
    sudo tee /usr/local/bin/update-pycharm >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

download_dir="$HOME/Downloads/pycharm"
metadata_file="$download_dir/pycharm-download.env"
install_link="/opt/pycharm"
launcher="/usr/local/bin/pycharm"
desktop_file="/usr/share/applications/jetbrains-pycharm.desktop"

require_cmd() {
    if ! command -v "$1" >/dev/null 2>&1; then
        printf 'Missing required command: %s\n' "$1" >&2
        exit 1
    fi
}

for cmd in curl python3 tar sha256sum sudo grep sed readlink desktop-file-validate update-desktop-database; do
    require_cmd "$cmd"
done

guard_existing_paths() {
    if [ -e "$install_link" ] && [ ! -L "$install_link" ]; then
        printf 'Refusing to replace existing non-symlink path: %s\n' "$install_link" >&2
        exit 1
    fi

    if [ -L "$install_link" ]; then
        link_target=$(readlink -f "$install_link" 2>/dev/null || true)
        raw_target=$(readlink "$install_link" 2>/dev/null || true)
        checked_target=${link_target:-$raw_target}
        case "$checked_target" in
            /opt/pycharm-* | pycharm-*) ;;
            *)
                printf 'Refusing to replace unexpected PyCharm symlink target: %s -> %s\n' "$install_link" "${checked_target:-unknown}" >&2
                exit 1
                ;;
        esac
    fi

    if [ -e "$launcher" ] || [ -L "$launcher" ]; then
        if ! grep -qx 'exec /opt/pycharm/bin/pycharm "$@"' "$launcher" 2>/dev/null; then
            printf 'Refusing to replace existing launcher: %s\n' "$launcher" >&2
            exit 1
        fi
    fi

    if [ -e "$desktop_file" ] || [ -L "$desktop_file" ]; then
        if ! grep -qx 'Exec=/opt/pycharm/bin/pycharm %f' "$desktop_file" 2>/dev/null; then
            printf 'Refusing to replace existing desktop entry: %s\n' "$desktop_file" >&2
            exit 1
        fi
    fi
}

mkdir -p "$download_dir"

python3 - >"$metadata_file" <<'PY'
import json
import platform
import shlex
import urllib.request

api_url = "https://data.services.jetbrains.com/products/releases?code=PCP&latest=true&type=release"
with urllib.request.urlopen(api_url, timeout=60) as response:
    data = json.load(response)

release = data["PCP"][0]
machine = platform.machine().lower()
platform_key = {
    "x86_64": "linux",
    "amd64": "linux",
    "aarch64": "linuxARM64",
    "arm64": "linuxARM64",
}.get(machine)

if not platform_key:
    raise SystemExit(f"Unsupported architecture: {machine}")

download = release["downloads"][platform_key]
archive = download["link"].rsplit("/", 1)[-1]

for key, value in {
    "pycharm_version": release["version"],
    "pycharm_platform": platform_key,
    "download_url": download["link"],
    "checksum_url": download["checksumLink"],
    "archive": archive,
}.items():
    print(f"{key}={shlex.quote(value)}")
PY

declare pycharm_version pycharm_platform download_url checksum_url archive
# shellcheck source=/dev/null
. "$metadata_file"

printf 'Using PyCharm %s for %s\n' "$pycharm_version" "$pycharm_platform"

guard_existing_paths

cd "$download_dir"
curl -fL --retry 3 -o "$archive" "$download_url"
curl -fL --retry 3 -o "$archive.sha256" "$checksum_url"
sha256sum -c "$archive.sha256"

top_dir=$(tar -tzf "$archive" | sed -n '1s#/.*##p')
case "$top_dir" in
    pycharm-*) ;;
    *)
        printf 'Unexpected archive layout: %s\n' "$top_dir" >&2
        exit 1
        ;;
esac

new_target="/opt/$top_dir"
old_target=""
if [ -e "$install_link" ] || [ -L "$install_link" ]; then
    old_target=$(readlink -f "$install_link" 2>/dev/null || true)
fi

sudo tar -xzf "$archive" -C /opt/
if [ ! -x "$new_target/bin/pycharm" ] || [ ! -f "$new_target/bin/pycharm.svg" ]; then
    printf 'Extracted archive is missing expected PyCharm files under: %s\n' "$new_target" >&2
    exit 1
fi

sudo ln -sfn "$new_target" "$install_link"

sudo tee "$launcher" >/dev/null <<'WRAPPER'
#!/usr/bin/env bash
exec /opt/pycharm/bin/pycharm "$@"
WRAPPER
sudo chmod 755 "$launcher"

sudo tee "$desktop_file" >/dev/null <<'DESKTOP'
[Desktop Entry]
Version=1.0
Type=Application
Name=PyCharm
Comment=Python IDE by JetBrains
Exec=/opt/pycharm/bin/pycharm %f
Icon=/opt/pycharm/bin/pycharm.svg
Terminal=false
StartupNotify=true
StartupWMClass=jetbrains-pycharm
Categories=Development;IDE;
MimeType=text/x-python;inode/directory;
DESKTOP

desktop-file-validate "$desktop_file"
sudo update-desktop-database /usr/share/applications

if [ -n "$old_target" ] && [ "$old_target" != "$new_target" ]; then
    printf 'Previous PyCharm directory remains at: %s\n' "$old_target"
fi

pycharm --version
EOF

    sudo chmod 755 /usr/local/bin/update-pycharm
fi

The helper writes only the managed PyCharm paths created by this workflow: /opt/pycharm, /usr/local/bin/pycharm, /usr/local/bin/update-pycharm, and /usr/share/applications/jetbrains-pycharm.desktop. It stops before overwriting an unrelated launcher, desktop entry, or non-symlink /opt/pycharm path.

Install PyCharm with the Helper

Run the helper as your normal desktop user. It downloads the current JetBrains tarball into ~/Downloads/pycharm, verifies the SHA256 file from JetBrains, extracts the archive into /opt, and creates the launcher paths.

update-pycharm

Relevant output should show the resolved version, a successful checksum result, and the installed PyCharm build. The exact version changes when JetBrains publishes a newer release.

Using PyCharm 2026.1.2 for linux
pycharm-2026.1.2.tar.gz: OK
PyCharm 2026.1.2
Build #PY-261.24374.152

Verify the command path and the active install directory after the helper finishes.

command -v pycharm
readlink -f /opt/pycharm

A successful install returns the wrapper in /usr/local/bin and a versioned directory under /opt.

/usr/local/bin/pycharm
/opt/pycharm-2026.1.2

Launch PyCharm on Fedora

Start PyCharm from a terminal attached to your desktop session or from Fedora’s application search. The first launch opens JetBrains’ setup flow, where you accept the license terms, choose settings, and sign in only if you need subscription-backed features.

Launch PyCharm from the Terminal

The terminal launcher uses the wrapper created in /usr/local/bin. Closing the terminal can also close the foreground IDE process, so launch from Activities for normal desktop use.

pycharm

If an older shell session does not see the command immediately, refresh the shell’s command cache or open a new terminal.

hash -r
command -v pycharm

Launch PyCharm from Activities

Open Activities, search for PyCharm, and select the JetBrains PyCharm launcher. If the icon does not appear right away, sign out and back in so GNOME reloads desktop-entry caches for the current session.

Configure PyCharm for Python Projects

PyCharm is installed, but each project still needs the correct Python interpreter. Fedora Workstation includes Python for system tooling, and development projects usually work best with an interpreter or virtual environment selected inside PyCharm’s project settings. If your Fedora system needs Python package tooling first, use the Fedora walkthrough to install Python on Fedora before creating project environments.

To check the interpreter path that PyCharm should see from your desktop account, run:

command -v python3
python3 --version

Use that path, or a project virtual environment path, when PyCharm asks for the interpreter during first-run project setup.

After accepting the agreement, PyCharm asks whether JetBrains can receive anonymous usage statistics. Choose the privacy option that fits your preference or organization policy; either choice continues the first-run setup.

Once those first-run choices are saved, PyCharm opens the welcome screen. Use this screen to create a new project, open an existing project directory, or clone a repository before selecting the interpreter or virtual environment for that project.

Update PyCharm on Fedora

Close PyCharm before replacing the active files under /opt. Then run the same helper used for the first install.

update-pycharm

If JetBrains publishes a newer build, the helper updates the /opt/pycharm symlink to the new versioned directory and leaves the previous directory in place as a short-term rollback option. Confirm the active version after the update.

pycharm --version
readlink -f /opt/pycharm

After the new version opens successfully, review old PyCharm directories and remove only the versioned paths you no longer want.

active_pycharm=$(readlink -f /opt/pycharm)
find /opt -maxdepth 1 -type d -name 'pycharm-*' ! -samefile "$active_pycharm" -print

Remove a specific old directory only after checking the printed path.

The next command permanently deletes the versioned PyCharm directory you name. Keep the active path printed by readlink -f /opt/pycharm and any rollback version you still need.

old_pycharm=/opt/pycharm-OLD_VERSION
case "$old_pycharm" in
    /opt/pycharm-*) sudo rm -rf -- "$old_pycharm" ;;
    *) printf 'Refusing unexpected path: %s\n' "$old_pycharm" >&2 ;;
esac

Remove PyCharm from Fedora

Remove PyCharm by deleting the wrapper, update helper, desktop entry, symlink, and active versioned directory created by this workflow. This does not delete your projects, but optional user-data cleanup later in this section removes IDE settings, plugins, and caches.

The removal block deletes only the managed PyCharm installation under /opt and wrapper files that match this workflow. It skips paths that appear to belong to another JetBrains install.

remove_if_matching() {
    path=$1
    pattern=$2
    label=$3

    if [ -e "$path" ] || [ -L "$path" ]; then
        if grep -qx "$pattern" "$path" 2>/dev/null; then
            sudo rm -f "$path"
        else
            printf 'Skipping unmanaged %s: %s\n' "$label" "$path" >&2
        fi
    fi
}

remove_if_matching /usr/local/bin/pycharm 'exec /opt/pycharm/bin/pycharm "$@"' launcher
remove_if_matching /usr/local/bin/update-pycharm "download_dir=\"\$HOME/Downloads/pycharm\"" update-helper
remove_if_matching /usr/share/applications/jetbrains-pycharm.desktop 'Exec=/opt/pycharm/bin/pycharm %f' desktop-entry

if [ -L /opt/pycharm ]; then
    active_pycharm=$(readlink -f /opt/pycharm 2>/dev/null || true)
    raw_target=$(readlink /opt/pycharm 2>/dev/null || true)
    checked_target=${active_pycharm:-$raw_target}

    case "$checked_target" in
        /opt/pycharm-* | pycharm-*)
            sudo rm -f /opt/pycharm
            if [ -n "$active_pycharm" ]; then
                sudo rm -rf "$active_pycharm"
            fi
            ;;
        *)
            printf 'Skipping unmanaged symlink: /opt/pycharm -> %s\n' "${checked_target:-unknown}" >&2
            ;;
    esac
elif [ -e /opt/pycharm ]; then
    printf 'Skipping unmanaged non-symlink path: /opt/pycharm\n' >&2
fi

sudo update-desktop-database /usr/share/applications
hash -r

Verify that the managed system paths are gone. If the command check still prints a path, it belongs to another install source that the guarded removal skipped.

command -v pycharm || echo "pycharm command removed"
test ! -e /opt/pycharm && echo "/opt/pycharm removed"
test ! -e /usr/share/applications/jetbrains-pycharm.desktop && echo "desktop entry removed"

If older version directories remain from previous updates, print them first and remove only the exact paths you do not need.

find /opt -maxdepth 1 -type d -name 'pycharm-*' -print

The helper also keeps downloaded archives and checksum files under ~/Downloads/pycharm. Remove that cache if you no longer need a local copy of the installer files.

rm -rf "$HOME/Downloads/pycharm"

Per-user JetBrains directories can contain settings, plugin downloads, local indexes, and cached project state. Review matching paths before deleting them.

find "$HOME/.config/JetBrains" "$HOME/.cache/JetBrains" "$HOME/.local/share/JetBrains" -maxdepth 1 -type d -name 'PyCharm*' -print 2>/dev/null

The next cleanup deletes local PyCharm settings, plugins, caches, and IDE state for the current Fedora account. Back up anything you want to keep before running it.

rm -rf "$HOME"/.config/JetBrains/PyCharm*
rm -rf "$HOME"/.cache/JetBrains/PyCharm*
rm -rf "$HOME"/.local/share/JetBrains/PyCharm*

Troubleshoot PyCharm on Fedora

Fix Existing PyCharm Path Conflicts

If update-pycharm prints Refusing to replace, one of the managed paths already exists and does not look like a file created by this workflow. Inspect the path before deleting or moving anything.

ls -ld /opt/pycharm /usr/local/bin/pycharm /usr/local/bin/update-pycharm /usr/share/applications/jetbrains-pycharm.desktop 2>/dev/null

If the path belongs to an older manual PyCharm install that you no longer need, back it up or remove that exact path, then rerun update-pycharm. Do not delete paths managed by JetBrains Toolbox App, Snap, or another package source.

Fix Missing Commands in the Update Helper

If update-pycharm stops with Missing required command, install the Fedora packages that provide the helper’s download, archive, checksum, and desktop-entry tools, then rerun the helper.

sudo dnf install curl python3 tar gzip coreutils grep sed desktop-file-utils
update-pycharm

Fix Unsupported Architecture Errors

The helper supports the Linux tarballs JetBrains publishes for x86_64 and aarch64/arm64. If it prints an unsupported architecture error, check what Fedora reports before trying another package format.

uname -m

For unsupported hardware, use JetBrains’ download page or Toolbox documentation to confirm whether a supported Linux build exists for that platform.

Fix PyCharm Checksum Failures

A checksum failure usually means the archive was partially downloaded, a proxy altered the file, or JetBrains changed the release while files were being fetched. Delete the cached archive and checksum, then rerun the helper so both files come from the same release.

rm -f "$HOME/Downloads/pycharm"/pycharm-*.tar.gz
rm -f "$HOME/Downloads/pycharm"/pycharm-*.tar.gz.sha256
update-pycharm

Fix a Missing PyCharm Activities Icon

If the terminal launcher works but Fedora’s application search does not show PyCharm, validate the desktop file and refresh the desktop database.

desktop-file-validate /usr/share/applications/jetbrains-pycharm.desktop
sudo update-desktop-database /usr/share/applications

No output from desktop-file-validate means the desktop entry is valid. Sign out and back in if GNOME still shows the old menu state.

Use Snap or Toolbox Instead

JetBrains recommends Toolbox App when you manage several JetBrains IDEs or want GUI-managed updates and rollbacks. JetBrains also publishes an official PyCharm snap, but Fedora needs snapd setup first; use the Fedora guide to install Snap on Fedora, then follow JetBrains’ PyCharm snap instructions from the official documentation.

Conclusion

PyCharm is ready on Fedora through JetBrains’ standalone Linux archive, with a repeatable update-pycharm command, a stable terminal launcher, and a desktop entry for Activities. From here, install Git on Fedora for version control, install Docker on Fedora for containerized projects, or enable SSH on Fedora for remote development workflows.

Share this guide

Help another Linux user troubleshoot faster

Share this guide with someone troubleshooting Linux systems or saving it for later.

Follow LinuxCapable

Want more LinuxCapable guides in Google?

Add LinuxCapable as a preferred source so Google can show more of our fresh Linux tutorials in Top Stories and From your sources when relevant.

Add LinuxCapable as a preferred source on Google
Search LinuxCapable

Need another guide?

Search LinuxCapable for package installs, commands, troubleshooting, and follow-up guides related to what you just read.

Found this guide useful?

Support LinuxCapable to keep tutorials free and up to date.

Buy me a coffeeBuy me a coffee
Before commenting, please review our Comments Policy.
Formatting tips for your comment

You can use basic HTML to format your comment. Useful tags currently allowed in published comments:

You type Result
<code>command</code> command
<strong>bold</strong> bold
<em>italic</em> italic
<blockquote>quote</blockquote> quote block

Got a Question or Feedback?

We read and reply to every comment - let us know how we can help or improve this guide.

Verify before posting: