1.1.0
This commit is contained in:
parent
411e2004e4
commit
e70562cbdc
7
.vscode/extensions.json
vendored
Normal file
7
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"ms-python.python",
|
||||
"ms-python.vscode-pylance",
|
||||
"ms-toolsai.jupyter"
|
||||
]
|
||||
}
|
30
.vscode/settings.jsonc
vendored
Normal file
30
.vscode/settings.jsonc
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
{ // Bitte daran denken das Kommentare eigentlich nicht von json unterstützt werden :-)
|
||||
// Das funktioniert hier nur in Microsofts jsonc im VS-Code!
|
||||
"python.linting.enabled": true,
|
||||
"python.linting.pylintEnabled": true,
|
||||
"python.linting.mypyEnabled": true,
|
||||
"python.linting.pylintArgs": ["--disable=C0114,C0115,C0116"],
|
||||
"editor.formatOnSave": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"python.analysis.typeCheckingMode": "basic",
|
||||
|
||||
// Abschliessende Leerzeichen entfernen:
|
||||
"files.trimTrailingWhitespace": true,
|
||||
"files.insertFinalNewline": true,
|
||||
|
||||
// Markdown für das Entfernen von abschliessenden Leerzeichen rausnehmen:
|
||||
"[markdown]": {
|
||||
"files.trimTrailingWhitespace": false,
|
||||
"editor.wordWrap": "off"
|
||||
},
|
||||
|
||||
// Für Pythonfiles Tababstand definieren und Tabs durch Leerzeichen ersetzen
|
||||
"[python]": {
|
||||
"editor.tabSize": 4,
|
||||
"editor.insertSpaces": true
|
||||
},
|
||||
|
||||
|
||||
}
|
17
.vscode/tasks.json
vendored
Normal file
17
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Linter (pylint)",
|
||||
"type": "shell",
|
||||
"command": "pylint beispiel.py",
|
||||
"group": "build"
|
||||
},
|
||||
{
|
||||
"label": "Typprüfung (mypy)",
|
||||
"type": "shell",
|
||||
"command": "mypy beispiel.py",
|
||||
"group": "build"
|
||||
}
|
||||
]
|
||||
}
|
64
CHANGELOG.md
64
CHANGELOG.md
@ -2,36 +2,48 @@
|
||||
|
||||
## pyUpload (TKInter-Version 1.0)
|
||||
|
||||
- **2025-04-22 - v.1.0.2**
|
||||
- **2025-04-25 - v1.1.0**
|
||||
- **Geändert:**
|
||||
- [x] Lizenz auf __MIT__ mit Namensnennung umgestellt, siehe [LICENSE](./LICENSE)
|
||||
|
||||
- Behoben
|
||||
-- Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`).
|
||||
-- `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`).
|
||||
- [x] `main.py` prüft nun zusätzlich, ob bereits mit `pythonw.exe` gestartet wurde, um doppelten Start mit neuem Fenster zu vermeiden
|
||||
- [x] `main.py` ruft nach `subprocess.Popen(...)` nun zuverlässig `sys.exit(0)` auf, um „leere“ Ursprungsfenster zu beenden
|
||||
- [x] `start.cmd` verwendet jetzt `python.exe` statt `pythonw.exe`, wodurch nur noch **ein** Konsolenfenster erscheint – auch beim Setup
|
||||
- [x] `start.sh` erkennt fehlendes `python3` und bricht mit Hinweis ab; Pfade werden sauber relativ berechnet
|
||||
|
||||
- Entfernt
|
||||
-- Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`).
|
||||
- **Behoben:**
|
||||
- [x] Mit diesen Änderungen behoben, dass unter Windows unnötige Consolenfenster gestartet werden und der Sprung nun sauber in die Virtuelle Umbebung `./app/.venv` erfolgt.
|
||||
|
||||
- **2025-04-21 - v.1.0.1**
|
||||
- **2025-04-22 - v1.0.2**
|
||||
|
||||
- Geändert
|
||||
- `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt`
|
||||
- Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik
|
||||
- `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad
|
||||
- `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln
|
||||
- **Behoben:**
|
||||
- [x] Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`).
|
||||
- [x] `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`).
|
||||
|
||||
- Hinzugefügt
|
||||
- Neue plattformunabhängige `start.sh` für Linux/macOS
|
||||
- Automatischer Restart nach Installation über `os.execv()` in `main.py`
|
||||
- Neue Sicherheits- und Netzwerkinformationen in der `README.md`
|
||||
- Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur
|
||||
- Hinweis auf Projektstatus und neue Version unter <https://github.com/realAscot/pyUpload2>
|
||||
- Neue LICENSE-Datei (proprietär, nicht zur Weitergabe)
|
||||
- start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind.
|
||||
- **Entfernt:**
|
||||
-- [x] Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`).
|
||||
|
||||
- Fixes
|
||||
- PowerShell-Inkompatibilitäten mit `set /p` entfernt
|
||||
- `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C
|
||||
- Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit)
|
||||
- **2025-04-21 - v1.0.1**
|
||||
|
||||
- **2025-04-21 - v.1.0.0**
|
||||
- release!
|
||||
- **Geändert:**
|
||||
- [x] `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt`
|
||||
- [x] Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik
|
||||
- [x] `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad
|
||||
- [x] `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln
|
||||
|
||||
- **Hinzugefügt:**
|
||||
- [x] Neue plattformunabhängige `start.sh` für Linux/macOS
|
||||
- [x] Automatischer Restart nach Installation über `os.execv()` in `main.py`
|
||||
- [x] Neue Sicherheits- und Netzwerkinformationen in der `README.md`
|
||||
- [x] Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur
|
||||
- [x] Hinweis auf Projektstatus und neue Version unter <https://github.com/realAscot/pyUpload2>
|
||||
- [x] Neue LICENSE-Datei (proprietär, nicht zur Weitergabe)
|
||||
- [x] start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind.
|
||||
|
||||
- **Fixes:**
|
||||
- [x] PowerShell-Inkompatibilitäten mit `set /p` entfernt
|
||||
- [x] `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C
|
||||
- [x] Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit)
|
||||
|
||||
- **2025-04-21 - v1.0.0**
|
||||
- [x] release!
|
||||
|
26
LICENSE
26
LICENSE
@ -1,17 +1,23 @@
|
||||
# LICENSE
|
||||
MIT License with Attribution Requirement
|
||||
|
||||
Copyright (c) 2025 Adam Skotarczak <adam@skotarczak.net>
|
||||
|
||||
Alle Rechte vorbehalten.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the “Software”), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, subject to the following conditions:
|
||||
|
||||
Diese Software ist urheberrechtlich geschützt. Die Verwendung, Vervielfältigung, Verbreitung oder Änderung
|
||||
dieser Software oder von Teilen davon ist ohne vorherige schriftliche Genehmigung des Autors ausdrücklich untersagt.
|
||||
1. The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
Die Software darf ausschließlich für private, interne oder zu Prüf- und Testzwecken verwendet werden.
|
||||
Eine kommerzielle Nutzung oder Weitergabe an Dritte ist nicht gestattet.
|
||||
2. **Attribution Requirement**: Any public use or distribution of this Software,
|
||||
modified or unmodified, must include a clear and visible attribution to the original author:
|
||||
|
||||
Die Bereitstellung dieser Software erfolgt OHNE JEGLICHE GARANTIE,
|
||||
weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die Garantien
|
||||
der Marktgängigkeit oder Eignung für einen bestimmten Zweck.
|
||||
**Adam Skotarczak <adam@skotarczak.net>**
|
||||
|
||||
Durch die Nutzung dieser Software erklärst du dich mit den oben genannten Bedingungen einverstanden.
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
56
README.md
56
README.md
@ -1,18 +1,21 @@
|
||||
# pyUpload (TKInter Version)
|
||||
# pyUpload (TKinter-Version)
|
||||
|
||||

|
||||
|
||||
## ⚠️ Projektstatus: Eingefroren – Nur noch Bugfixes
|
||||
|
||||
Diese Version von **pyUpload** wird **nicht weiterentwickelt** und erhält nur noch Fehlerbehebungen.
|
||||
Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
|
||||
Die neue Version mit Flask-Backend wird **bald** verfügbar sein unter:
|
||||
|
||||
🔗 **<https://github.com/realAscot/pyUpload2>**
|
||||
|
||||
---
|
||||
|
||||
- [pyUpload (TKInter Version)](#pyupload-tkinter-version)
|
||||
## 📑 Inhalt der Readme
|
||||
|
||||
- [pyUpload (TKinter-Version)](#pyupload-tkinter-version)
|
||||
- [⚠️ Projektstatus: Eingefroren – Nur noch Bugfixes](#️-projektstatus-eingefroren--nur-noch-bugfixes)
|
||||
- [📑 Inhalt der Readme](#-inhalt-der-readme)
|
||||
- [pyUpload – Sicherer Datei-Upload-Server über HTTPS (lokal \& offline)](#pyupload--sicherer-datei-upload-server-über-https-lokal--offline)
|
||||
- [🛠 Features](#-features)
|
||||
- [🚀 Schnellstart](#-schnellstart)
|
||||
@ -24,7 +27,7 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
|
||||
- [🔐 Hinweis zur SSL-Zertifikatswarnung](#-hinweis-zur-ssl-zertifikatswarnung)
|
||||
- [💡 Ideen für zukünftige Entwicklungen](#-ideen-für-zukünftige-entwicklungen)
|
||||
- [🐛 Bekannte Bugs](#-bekannte-bugs)
|
||||
- [👨💻 Autor und alle beteiligte](#-autor-und-alle-beteiligte)
|
||||
- [## 👨💻 Autor und Beteiligte](#--autor-und-beteiligte)
|
||||
- [📝 Lizenz](#-lizenz)
|
||||
|
||||
---
|
||||
@ -34,6 +37,8 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
|
||||
Diese Version basiert auf **Tkinter (GUI + QR)** sowie einer optionalen **reinen CLI-Nutzung**.
|
||||
Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen Tools oder komplexen Abhängigkeiten.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Features
|
||||
@ -46,6 +51,8 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To
|
||||
- **automatische Einrichtung von `.venv` und Abhängigkeiten**
|
||||
- **kein Installationsskript mehr nötig – alles passiert beim Start von `main.py`**
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Schnellstart
|
||||
@ -60,7 +67,7 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To
|
||||
```
|
||||
|
||||
Alternativ einfach eine bereinigte `.zip` bei den [Releases auf GitHub](https://github.com/realAscot/pyUpload/releases/) herrunterladen.
|
||||
Diese enthällt kein `.git Archiv` und enthält nur das aller nötigste zum Betrieb des Programms.
|
||||
Diese enthält kein `.git`-Archiv und nur das Allernötigste für den Betrieb des Programms.
|
||||
|
||||
2. Starte die App mit:
|
||||
|
||||
@ -76,12 +83,16 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To
|
||||
|
||||
⚠️ **Alternative 2 falls die Ausführung per Doppelklick auf .bat oder .cmd gesperrt ist:**
|
||||
|
||||
> Doppelklick auf -> `start.pyw`
|
||||
Doppelklick auf `start.pyw` oder im Terminal mit:
|
||||
|
||||
Es ist möglich das beim ersten mal gefragt wird womit das Programm gestartet werden soll.
|
||||
```cmd
|
||||
python start.pyw`
|
||||
```
|
||||
|
||||
Es ist möglich, dass beim ersten Mal gefragt wird, womit das Programm gestartet werden soll.
|
||||
Einfach die Python-Installation suchen und `python.exe` wählen.
|
||||
|
||||
Ich empfehle einfach eine Verknüpfung der `start.pyw` zB auf den Desktop oder ins Startmenü zu legen.
|
||||
|
||||
Ich empfehle, eine Verknüpfung der `start.pyw` z. B. auf dem Desktop zu erstellen
|
||||
|
||||
### 🐧 Für Linux / macOS:
|
||||
|
||||
@ -111,6 +122,8 @@ Beim ersten Start wird automatisch:
|
||||
- `requirements.txt` installiert
|
||||
- das Programm danach neu aus der Umgebung gestartet
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🧩 Kommandozeilenoptionen
|
||||
@ -135,6 +148,8 @@ pythonw.exe start.pyw --port 9999 # Custom-Port verwenden
|
||||
|
||||
Wenn Du die Dateierweiterung `.pyw` mit `pythonw.exe` verknüpfst, klappt es auch ohne mit Doppelklick im Explorer :-)
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Zugriff im Browser
|
||||
@ -150,6 +165,8 @@ Dateien werden im `upload/<Client-IP>/` gespeichert.
|
||||
|
||||
Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wird, falls man die Adresse händisch eingibt statt mit QR-Code! Man könnte noch zusätzlich einen http-server in der App laufen lassen, der dann automatisch umleitet, aber wir möchten das Programm so klein wie möglich halten.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 📁 Logs & Uploads
|
||||
@ -158,6 +175,8 @@ Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wir
|
||||
- **Zentrale Logs**: `logs/pyupload.log`
|
||||
- **Pro-Client Logs**: `logs/<Client-IP>.log`
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Hinweis zur SSL-Zertifikatswarnung
|
||||
@ -172,7 +191,10 @@ Da das in lokalen oder testnahen Umgebungen in der Regel nicht der Fall ist, lä
|
||||
|
||||
>💡 **Wichtig zu wissen:**
|
||||
Die Verbindung ist trotzdem Ende-zu-Ende verschlüsselt. Die Schlüssel werden bei jedem Start lokal neu generiert – direkt auf deinem Rechner.
|
||||
Technisch ist die Verbindung also sicher. Dein Browser vertraut dem Zertifikat nur nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt – sondern von dir selbst.
|
||||
Technisch ist die Verbindung also sicher.
|
||||
Dein Browser vertraut dem Zertifikat lediglich nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt, sondern lokal erzeugt wurde.
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
@ -186,6 +208,8 @@ Beiträge willkommen!
|
||||
- [ ] _____________________________________________________
|
||||
- [ ] _____________________________________________________
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Bekannte Bugs
|
||||
@ -193,11 +217,14 @@ Beiträge willkommen!
|
||||
- **Frontend:** wenn im Browser der Button Hochladen gewählt wird, OHNE das Dateien ausgewählt wurden,
|
||||
kommt es zu einem *Error response - Error code: 400* im Browser. Lösungsansatz wäre den Button über JS zu sperren solange keine Datei ausgewählt ist. Lässt sich schnell im [template](./app/template.html) erledigen.
|
||||
|
||||
Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorraus!
|
||||
Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu.
|
||||
Ich danke im Voraus!
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 👨💻 Autor und alle beteiligte
|
||||
## ## 👨💻 Autor und Beteiligte
|
||||
|
||||
- **Adam Skotarczak**
|
||||
Kontakt: [adam@skotarczak.net](mailto:adam@skotarczak.net)
|
||||
@ -205,9 +232,10 @@ Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorra
|
||||
|
||||
- **Du?**
|
||||
|
||||
[🔝](#-inhalt-der-readme)
|
||||
|
||||
---
|
||||
|
||||
## 📝 Lizenz
|
||||
|
||||
- Proprietär, © 2025 Adam Skotarczak
|
||||
**Keine Weitergabe ohne ausdrückliche Genehmigung**
|
||||
MIT [LICENSE](./LICENSE) – frei verwendbar in eigenen Projekten bei Namensnennung.
|
||||
|
@ -19,7 +19,7 @@ VENV_PYTHON = os.path.join(VENV_DIR, "Scripts", "python.exe") if os.name == "nt"
|
||||
REQUIREMENTS_FILE = os.path.join(BASE_DIR, "requirements.txt")
|
||||
|
||||
# Wenn wir NICHT in der venv sind
|
||||
if sys.prefix == sys.base_prefix:
|
||||
if sys.prefix == sys.base_prefix and sys.executable != VENV_PYTHON:
|
||||
# venv erstellen falls nötig
|
||||
if not os.path.exists(VENV_DIR):
|
||||
print("[Setup] Virtuelle Umgebung wird erstellt...")
|
||||
@ -34,6 +34,7 @@ if sys.prefix == sys.base_prefix:
|
||||
|
||||
if os.name == "nt":
|
||||
subprocess.Popen([VENV_PYTHON] + sys.argv, creationflags=subprocess.CREATE_NEW_CONSOLE)
|
||||
sys.exit(0)
|
||||
else:
|
||||
os.execv(VENV_PYTHON, [VENV_PYTHON] + sys.argv)
|
||||
sys.exit(0)
|
||||
|
@ -15,4 +15,10 @@ if errorlevel 1 (
|
||||
set SCRIPT_DIR=%~dp0
|
||||
|
||||
:: Starte den Python-Wrapper, der .venv erkennt
|
||||
pythonw.exe "%SCRIPT_DIR%start.pyw" %*
|
||||
if exist app\.venv\Scripts\python.exe (
|
||||
python.exe "%SCRIPT_DIR%start.pyw" %*
|
||||
) else (
|
||||
echo Erste Initialisierung erforderlich.
|
||||
echo Starte Setup-Konsole...
|
||||
start cmd /k python.exe "%SCRIPT_DIR%start.pyw" %*
|
||||
)
|
||||
|
@ -13,4 +13,5 @@ venv_python = os.path.join("app", ".venv", "Scripts", "python.exe") if os.name =
|
||||
python_exec = venv_python if os.path.exists(venv_python) else sys.executable
|
||||
|
||||
# Starte main.py
|
||||
subprocess.run([python_exec, "app/main.py"] + sys.argv[1:])
|
||||
main_script = os.path.abspath(os.path.join("app", "main.py"))
|
||||
subprocess.run([python_exec, main_script] + sys.argv[1:])
|
||||
|
7
start.sh
7
start.sh
@ -1,6 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Verzeichnis dieser Datei bestimmen
|
||||
# Absoluten Pfad zur start.pyw berechnen (falls per Symlink gestartet)
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# Python-Interpreter prüfen
|
||||
@ -10,5 +11,5 @@ if ! command -v python3 &> /dev/null; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starte das Hauptskript
|
||||
python3 "$SCRIPT_DIR/app/main.py" "$@"
|
||||
# Direkt ausführen
|
||||
python3 "$SCRIPT_DIR/start.pyw" "$@"
|
||||
|
Loading…
x
Reference in New Issue
Block a user