J'ai récemment porté mon projet Python pour courir sur Python 3.1. Pour cela, je devais adopter la politique des importations relatives au sein des sous-modules et des sous-espaces de mon projet. Je n'ai pas cela et maintenant le projet lui-même fonctionne, mais j'ai remarqué que je ne peux pas exécuter aucun des sous-remplissages ou de sous-modules. Si j'essaie, je reçois "cométine.valueError: tentative d'importation relative dans le non-paquet". Je ne peux que importer l'ensemble du projet. P>
est-ce normal? P>
3 Réponses :
Oui, c'est normal. Si vous souhaitez exécuter un module qui fait également partie d'un paquet (en soi une chose étrange à faire), vous devez avoir des importations absolues. Lorsque vous exécutez le module, il ne s'agit pas du point de vue des interprètes, une partie d'un package, mais le module Le moyen standard de le faire est d'avoir des fonctions dans les packages et de séparer les scripts exécutables qui appellent les fonctions, car cela vous permet de mettre les scripts exécutables en dehors du module, par exemple en / usr / bin p> __ MAIN __ code>. Donc, cela ne saurait pas où sont les forfaits relatifs. P>
Wow, je trouve cette philosophie bizarre. Par exemple, j'ai dans mon projet un paquet vie code>. Son chemin absolu est
garlicsim.bundled.simulation_packages.life code>. J'aurais aimé pouvoir l'exécuter en soi, car cela ne dépend de rien dans
Garlicsim code>. Pourquoi ne devrais-je pas être capable de le courir seul?
1. Si cela ne dépend de rien à Garlicsim, alors pourquoi est-ce à Garlicsim? 2. Pourquoi ne seriez-vous pas capable de le courir seul? Vous pouvez l'exécuter en soi, mais vous devez avoir des importations absolues, c'est de garlicsim.bundled.simulation_packages.life importer quel que soit code>. 3. Quelle est la philosophie que vous trouvez bizarre? Je n'ai mentionné aucune philosopfie, donc je ne sais pas ce que "cette" philosophie est.
1. C'est juste groupé dans. Mais je pourrais prendre un autre exemple, de garlicsim.asynchronous_crunching.cunchers code>, qui est un sous-package que Garlicsim dépend, mais cela n'est pas dépendant de Garlicsim. (2) Dites si je veux le déplacer vers un autre paquet un jour, pourquoi ne devrais-je pas être capable de, sans la modification des lignes d'importation? (3) J'aurais peut-être dû dire "politique" au lieu de "philosophie". Cette attitude, d'être capable d'exécuter l'emballage indépendamment, ou (b) le port sur d'autres packages facilement, mais pas à la fois i>.
Geez. Qu'est-ce que c'est avec des gens qui se disputent contre les réponses aujourd'hui? :-) Tu ne peux pas le déplacer facilement? N'est pas une recherche et remplacer facilement? Vous devez faire cette recherche et remplacer de toute façon à Garlicsim. --- Il n'y a pas de telle politique. Il n'est cependant pas possible de faire ce que vous voulez, mais encore une fois, il n'y a pas de raison convaincante de le faire. --- Si vous n'êtes pas d'accord avec la modification de la manière dont les importations relatives ont changé dans Python 3 (et il y a très i> de bonnes raisons de changer de changement) que de se plaindre sur Python-Dev, et préparez-vous à obtenir Flammé, :-)
Vous pouvez utiliser -M drapeau de l'interprète Python pour exécuter des modules dans des sous-packages (ou même des packages en 3.1.). P>
Je dirais que vous I> avez i> utiliser le commutateur -m code>; Ce n'est pas que vous peut i>. J'aime appeler directement des fichiers Python, car je n'ai pas besoin de vous rappeler le commutateur et que ma coque est bien terminée.
Voir cette réponse si vous êtes intéressant dans l'exécution d'un script de Python exécutable à partir d'une sous-module: Stackoverflow.com/a/11537218/730150 a>
Les importations relatives implicites sont obsolètes et supprimées dans Python 2.7.
Arron, tu as raison mais je ne vois pas comment cela changera ma solution. Cela fonctionne avec n'importe quel python 2.5-3.1.
Non, cela ne fonctionne pas dans 3.x. Il est supprimé en 2.7+, qui comprend 3.0-3.1.
@Arron, avez-vous essayé le code ci-dessus et il échoue à courir? Je suppose que non, je l'ai exécuté sur Python 2.6, 2.7 et 3.1. Le changement que vous parlez n'affecte que le comportement des lignes telles que Import Bar Code> et c'est pourquoi j'ai proposé cette utilisation, pour convaincre Python de préférer le chargement du module code> de la barre code> du répertoire actuel si possible.
@Aarongallagher, que voulez-vous dire? Bien sûr, je peux importer un fichier dans le répertoire de travail nommé bar.py code> à partir du script principal ou du shell interactif. Je ne peux tout simplement pas le faire d'un module.
Pour Python3 compatible, sauf (ValueError, erreur système) code> semble fonctionner.