Table des matières
Problème Contexte et défis
Résumer
Maison développement back-end Tutoriel Python Exécuter psql.exe dans le script python et gérer la redirection d'E / S

Exécuter psql.exe dans le script python et gérer la redirection d'E / S

Oct 01, 2025 am 08:51 AM

Exécuter PSQL.exe dans le script Python et gérer la redirection d'E / S

Ce didacticiel explore comment exécuter correctement les commandes externes avec des paramètres et des redirections d'E / S (telles que

Problème Contexte et défis

Lors de l'exécution d'outils de ligne de commande externes dans des scripts Python, des comportements inattendus sont souvent rencontrés lorsque les commandes incluent une syntaxe spécifique à la coquille telle que la redirection d'E / S (telle que la lecture de l'entrée

 psql.exe postgresql: // utilisateur: pass @ hôte: port / <backup.sql><p> Les utilisateurs peuvent constater que l'exécution de cette commande directement sur la ligne de commande peut importer avec succès les instructions SQL dans le fichier backup.sql dans la base de données, mais dans Python Scripts, PSQL.EXE est tout simplement démarré, ne traite pas la chaîne de connexion, ne lit pas la saisie de Backup.sql, mais attend l'utilisateur pour entrer manuellement.</p>
<p> La raison de ce problème est que le module de sous-processus de Python n'analyse pas et n'exécutera pas les commandes via le shell système par défaut (c'est-à-dire shell = false). Il transmet les commandes et leurs paramètres directement au système d'exploitation. Cela signifie que des chaînes comme <backup.sql sont trait par psql.exe comme un param de ligne commande normal plut que d interpr l standard du fichier backup.sql lui-m ne prend pas directement en charge cette forme redirection qui est la fonction shell.><h3> Solution: utilisez le shell système pour l'analyse des commandes</h3>
<p> Pour résoudre ce problème, l'idée principale est de permettre au coquille du système d'être responsable de l'analyse des caractères spéciaux dans la commande, y compris la redirection d'E / S. Cela peut être réalisé via le paramètre Shell = True du module de sous-processus. Lorsque shell = true, le sous-processus passe la commande entière (ou une chaîne de commande épissée d'une liste de paramètres) au shell par défaut du système (par exemple, CMD.exe sur Windows, Bash ou Zsh sur Linux / MacOS) à exécuter. De cette façon, le shell interprétera correctement le <symbole et terminera la redirection du contenu fichier.><p> La bonne façon consiste à faire une séquence (tuple ou liste) avec des commandes, des chaînes de connexion et des symboles de redirection et leurs chemins de fichier comme éléments séparés et les transmettre à sub-process.check_call, et définir shell = true. Lorsque le sous-processus reçoit une séquence avec shell = true, il concaténera ses éléments en une chaîne de commande complète avec des espaces, puis remettra la chaîne sur le shell pour l'exécution.</p>
<p> Voici un exemple de code spécifique qui montre comment exécuter correctement la commande psql.exe avec la redirection d'E / S dans Python:</p>
<pre class="brush:php;toolbar:false"> sous-processus d'importation
Importer un système d'exploitation

# --- Simuler les informations de configuration, veuillez les remplacer par votre source de configuration lorsque vous l'utilisez ---
Class Config:
    login = "your_user"
    mot de passe = "votre_password"
    host = "localhost"
    port = "5432"
conf = config ()
# --- Les informations de configuration de simulation se terminent ---

# Assurez-vous que les chemins des fichiers PSQL.exe et SQL sont corrects # Le chemin ici est relatif au répertoire parent du script actuel. Veuillez l'ajuster en fonction de la situation réelle # Supposons que PSQL.EXE se trouve dans le répertoire parent du script actuel psql_commandlet = os.path.abspath (os.path.join (os.path.dirname (__ file__), "..", "psql.exe"))
# Supposons que Backup.Sql se trouve dans le répertoire parent du script actuel Backup_file_path = os.path.abspath (os.path.join (os.path.dirname (__ file__), "..", "backup.sql")))

# Build PostgreSQL Connexion String User = conf.login
mot de passe = conf.password
hôte = conf.host
port = conf.port
connection_string = f "PostgreSQL: // {user}: {mot de passe} @ {host}: {port} / your_database_name" # N'oubliez pas de remplacer le nom de la base de données def run_psql_restore ():
    "" "
    Utilisez le module de sous-processus pour exécuter la commande psql.exe et la redirection d'entrée de fichier de processus.
    "" "
    print (f "Essayez d'exécuter la commande psql vers: {connection_string}")
    print (f "Lire les entrées du fichier '{backup_file_path}'.")

    essayer:
        Solution #Core:
        # 1. Mettez les commandes, les chaînes de connexion, les symboles de redirection et les chemins de fichier en tuples en tant qu'éléments séparés.
        # 2. Set shell = true pour permettre au shell système d'analyser le symbole de redirection '<p>Dans le code ci-dessus, sub-process.check_call ((psql_commandlet, connexion_string, "</p><h3> Notes et meilleures pratiques pour shell = true</h3><p> Bien que Shell = True offre une commodité pour résoudre ces problèmes, les points suivants doivent être prêts à l'attention lors de l'utilisation:</p><ol>
<li> <strong>Risque de sécurité:</strong> Shell = True présente des risques de sécurité potentiels, en particulier lorsque la chaîne de commande ou une partie de celle-ci est dérivée de l'entrée utilisateur non fiable. Un utilisateur malveillant peut effectuer des opérations non autorisées en injectant des commandes de shell supplémentaires. Par exemple, si Backup_file_path est fourni par l'utilisateur et n'a pas été strictement vérifié, l'utilisateur peut entrer "MALICIET.SQL; RM -RF /", qui peut être exécuté en cas de shell = true. Par conséquent, il est important de vérifier et de nettoyer strictement toutes les entrées externes.</li>
<li> <strong>Différence de plate-forme:</strong> différents systèmes d'exploitation utilisent différents shells (Windows est CMD.exe, Linux / MacOS est généralement bash ou zsh, etc.), et leur syntaxe de commande peut être subtile. Lorsque vous utilisez shell = true, vous devez vous assurer que la commande peut être exécutée correctement dans le shell sur le système de fonctionnement cible.</li>
<li> <strong>Performance Overhead:</strong> Le démarrage d'un processus de coquille supplémentaire entraînera de légères frais généraux de performances. Pour les commandes simples qui nécessitent une exécution fréquente, si vous n'avez pas besoin de fonctions de shell spécial, il est généralement recommandé d'utiliser shell = false.</li>
<li> <strong>Gestion des erreurs:</strong> Sub-Process.check_call lancera une exception CpeeProcessError lorsque la commande renvoie un code de sortie non nul, ce qui est très utile pour juger si la commande est réussie. Pour obtenir une sortie plus détaillée (sortie standard et erreur standard), vous pouvez utiliser la fonction Sub-Process.Run et définir CAPture_Output = true et Text = true.</li>
</ol><h4> Alternatives (plus sûres mais peut-être plus complexes)</h4><p> Pour une redirection d'entrée de fichier simple, cela peut être fait sans utiliser shell = true, qui est généralement plus sûr:</p><pre class="brush:php;toolbar:false"> sous-processus d'importation
Importer un système d'exploitation

# Supposons que PSQL_COMMANDLET et Connection_String sont définis # ... (identiques que définis dans le code ci-dessus) ...

def run_psql_restore_safe ():
    print (f "Essayez d'exécuter la commande psql (mode sûr) vers: {connection_string}")
    print (f "Lire les entrées du fichier '{backup_file_path}'.")

    essayer:
        avec ouvert (backup_file_path, 'r') comme sql_file:
            # N'utilisez pas shell = true, passez directement le sous-processement de l'objet de fichier.check_call via le paramètre stdin (
                [psql_commandlet, connexion_string], # Commande et liste de paramètres stdin = sql_file # prendre des objets de fichier comme entrée standard)
        Print ("\ npsql.exe Commande exécutée avec succès (mode sûr).")
    sauf le sous-processus.
        print (f "\ nerror: L'exécution de la commande psql.exe a échoué, code de retour: {e.returncode}")
    Sauf FileNotFoundError:
        print (f "\ nerror: le fichier psql.exe ou sql ne peut être trouvé.")
    sauf exception comme e:
        print (f "\ \ nunknown error s'est produit lors de l'exécution: {e}")

# si __name__ == "__main__":
# # ... (Simuler la création de fichiers) ...
# run_psql_restore_safe ()

Cette méthode tue directement le contenu du fichier à l'entrée standard de psql.exe via stdin = sql_file, en évitant l'intervention du shell et en améliorant ainsi la sécurité. Cependant, cette approche ne convient que pour une simple redirection d'entrée. Pour les scénarios où les fonctions de shell plus complexes (telles que les pipelines, les chaînes de commande, les paramètres de variables d'environnement, etc.), Shell = true est toujours un choix plus direct.

Résumer

Comprendre le fonctionnement du module de sous-processus est crucial lors de l'exécution de commandes externes dans des scripts Python et de la gestion des redirections d'E / S (telles que

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment installer des packages à partir d'un fichier exigence.txt dans Python Comment installer des packages à partir d'un fichier exigence.txt dans Python Sep 18, 2025 am 04:24 AM

Exécutez pipinstall-rrequirements.txt pour installer le package de dépendance. Il est recommandé de créer et d'activer l'environnement virtuel d'abord pour éviter les conflits, s'assurer que le chemin du fichier est correct et que le PIP a été mis à jour et utiliser des options telles que --No-Deps ou --User pour ajuster le comportement d'installation si nécessaire.

Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Sep 19, 2025 pm 05:12 PM

Ce tutoriel détaille comment fusionner efficacement l'adaptateur PEFT LORA avec le modèle de base pour générer un modèle complètement indépendant. L'article souligne qu'il est faux d'utiliser directement Transformers.Automodel pour charger l'adaptateur et fusionner manuellement les poids, et fournit le processus correct pour utiliser la méthode Merge_and_unload dans la bibliothèque PEFT. De plus, le tutoriel souligne également l'importance de traiter les segments de mots et discute des problèmes et des solutions de compatibilité des versions de PEFT.

Comment tester le code Python avec Pytest Comment tester le code Python avec Pytest Sep 20, 2025 am 12:35 AM

Python est un outil de test simple et puissant dans Python. Après l'installation, les fichiers de test sont automatiquement découverts en fonction des règles de dénomination. Écrivez une fonction commençant par test_ pour les tests d'assurance, utilisez @ pytest.fixture pour créer des données de test réutilisables, vérifiez les exceptions via PyTest.Rais, prend en charge l'exécution de tests spécifiés et plusieurs options de ligne de commande et améliore l'efficacité des tests.

Comment gérer les arguments de ligne de commande dans Python Comment gérer les arguments de ligne de commande dans Python Sep 21, 2025 am 03:49 AM

TheargParsemoduleisthereComMendwaytoHandleCommand-lineargumentsInpython, fournissantRobustParsing, Typevalidation, HelpMessages, AnderrorHling; usys.argvforsimplécasesrequiringminimalsepup.

Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Sep 19, 2025 pm 05:57 PM

Cet article vise à explorer le problème commun de la précision de calcul insuffisante des nombres de points flottants dans Python et Numpy, et explique que sa cause profonde réside dans la limitation de représentation des nombres de points flottants 64 bits standard. Pour les scénarios informatiques qui nécessitent une précision plus élevée, l'article introduira et comparera les méthodes d'utilisation, les fonctionnalités et les scénarios applicables de bibliothèques mathématiques de haute précision telles que MPMATH, SYMPY et GMPY pour aider les lecteurs à choisir les bons outils pour résoudre les besoins de précision complexe.

Comment travailler avec les fichiers PDF dans Python Comment travailler avec les fichiers PDF dans Python Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPLUMBER et FPDF sont les bibliothèques de base pour Python pour traiter PDF. Utilisez le PYPDF2 pour effectuer l'extraction de texte, la fusion, la division et le chiffrement, tels que la lecture de la page via Pdfreader et l'appel extract_text () pour obtenir du contenu; PDFPLUMBER convient plus pour conserver l'extraction de texte de mise en page et la reconnaissance de la table, et prend en charge extract_tables () pour capturer avec précision les données de table; FPDF (FPDF2 recommandé) est utilisé pour générer du PDF, et les documents sont construits et sorties via add_page (), set_font () et cellule (). Lors de la fusion des PDF

Python Obtenez l'exemple de l'heure actuelle Python Obtenez l'exemple de l'heure actuelle Sep 15, 2025 am 02:32 AM

L'obtention de l'heure actuelle peut être implémentée dans Python via le module DateTime. 1. Utilisez dateTime.now () pour obtenir l'heure actuelle locale, 2. Utilisez le strftime ("% y-% m-% d% h:% m:% s") pour formater l'année de sortie, le mois, le jour, l'heure, la minute et la seconde, 3. UTCNow () et les opérations quotidiennes peuvent répondre aux besoins en combinant DateTime.now () avec des chaînes formatées.

Comment pouvez-vous créer un gestionnaire de contexte en utilisant le décorateur @contextManager dans Python? Comment pouvez-vous créer un gestionnaire de contexte en utilisant le décorateur @contextManager dans Python? Sep 20, 2025 am 04:50 AM

Importer @ contextManagerfromContextLibandDeFineAgeneratorFonctionnement toTyieldSexactlyOnce, où les actes de championnalsAnterAndCodeLifteryiel

See all articles