


Exécuter psql.exe dans le script python et gérer la redirection d'E / S
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 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. 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 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 ()
Résumer
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

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

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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

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.

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

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.

Importer @ contextManagerfromContextLibandDeFineAgeneratorFonctionnement toTyieldSexactlyOnce, où les actes de championnalsAnterAndCodeLifteryiel
