7
votes

Python: Les importations relatives signifient-elles que vous ne pouvez pas exécuter un sous-vue en soi?

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.

est-ce normal?


0 commentaires

3 Réponses :


4
votes

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 __ MAIN __ . Donc, cela ne saurait pas où sont les forfaits relatifs.

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


4 commentaires

Wow, je trouve cette philosophie bizarre. Par exemple, j'ai dans mon projet un paquet vie . Son chemin absolu est garlicsim.bundled.simulation_packages.life . J'aurais aimé pouvoir l'exécuter en soi, car cela ne dépend de rien dans Garlicsim . 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 . 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 , 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 .


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 de bonnes raisons de changer de changement) que de se plaindre sur Python-Dev, et préparez-vous à obtenir Flammé, :-)



3
votes

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.).


2 commentaires

Je dirais que vous avez utiliser le commutateur -m ; Ce n'est pas que vous peut . 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