J'ai un dossier pour mon code client, un dossier pour mon code serveur et un dossier pour le code qui est partagé entre eux
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Comment importer Common.py depuis Server.py et Client.py?
python
python-3.x
import
shared-libraries
relative-path
A dessiné
la source
la source
Réponses:
EDIT Nov 2014 (3 ans plus tard):
Python 2.6 et 3.x prend en charge les importations relatives appropriées, où vous pouvez éviter de faire quoi que ce soit de piraté. Avec cette méthode, vous savez que vous obtenez une importation relative plutôt qu'une importation absolue . Le '..' signifie, allez dans le répertoire au-dessus de moi:
En guise de mise en garde, cela ne fonctionnera que si vous exécutez votre python en tant que module, depuis l' extérieur du package. Par exemple:
Voie piratée originale
Vous pouvez ajouter Common / à votre sys.path (la liste des chemins que python regarde pour importer des choses):
os.path.dirname(__file__)
vous donne simplement le répertoire dans lequel se trouve votre fichier python actuel, puis nous naviguons vers le répertoire «Common /» et importons le module «Common».la source
from ...myfile
va à../../myfile
Assez drôle, un même problème que je viens de rencontrer, et j'obtiens ce travail de la manière suivante:
en combinant avec la commande linux
ln
, nous pouvons rendre les choses beaucoup plus simples:Et maintenant si vous souhaitez importer
some_stuff
depuis un fichier:Proj/Common/Common.py
dans votre fichierProj/Client/Client.py
:, comme ceci:Et, la même chose s'applique à
Proj/Server
, Fonctionne également pour lesetup.py
processus, une même question discutée ici , espérons que cela aide!la source
Ne faites pas d'importation relative.
À partir de PEP8 :
Mettez tout votre code dans un super package (c'est-à-dire "myapp") et utilisez des sous-packages pour le client, le serveur et le code commun.
Mise à jour: " Python 2.6 et 3.x prend en charge les importations relatives appropriées (...) ". Voir les réponses de Dave pour plus de détails.
la source
if __name__ == "__main__":
ligne « ». Autrement dit, vous voulez pouvoir les utiliser en tant que scripts autonomes. Comment le faire correctement? Je pense que c'est un cas d'utilisation parfaitement courant qui devrait être pris en charge. Pourquoi est-ce découragé?Faire une importation relative est absolument OK! Voici ce que fait le petit moi:
la source
__file__
pour obtenir la bonne relation à partir du fichier actuelLa méthode d'importation par défaut est déjà "relative", à partir du PYTHONPATH. Le PYTHONPATH est par défaut, vers certaines bibliothèques système avec le dossier du fichier source d'origine. Si vous exécutez avec -m pour exécuter un module, le répertoire actuel est ajouté au PYTHONPATH. Donc, si le point d'entrée de votre programme se trouve à l'intérieur de Proj, utilisez
import Common.Common
devrait fonctionner à la fois dans Server.py et Client.py.Ne faites pas d'importation relative. Cela ne fonctionnera pas comme vous le souhaitez.
la source