Переменная окружения PYTHONPATH ... как мне впоследствии создать каждый подкаталог? - PullRequest
1 голос
/ 01 ноября 2009

Я сейчас делаю это:

PYTHONPATH=/home/$USER:/home/$USER/respository:/home/$USER/repository/python-stuff

Как я могу сделать так, чтобы PYTHONPATH мог включать все подкаталоги?

PYTHONPATH = /home/$USER/....and-all-subdirectories

Ответы [ 2 ]

9 голосов
/ 01 ноября 2009

Обычно плохая идея иметь на sys.path два пути, один из которых является родительским для другого - при условии, что подкаталог содержит файл __init__.py, чтобы пометить его как пакет, конечно. Если в пути находится только родительский каталог (а $PYTHONPATH является частью того, с чем инициализируется sys.path), модули в подкаталоге могут быть импортированы из пакета, т. Е. Только по одному пути файловой системы, что позволяет избежать риска один модуль импортируется под разными формами.

Так почему бы вам просто не поместить файлы __init__.py во все подкаталоги, которые в этом нуждаются, и использовать импорт пакетов?

Хотя я думаю, что ваш запрос - плохая идея, он, безусловно, выполним - команда Unix find может легко перечислить все подкаталоги каталога, по одному на строку (find . -type d), и вы можете легко склеить строки например по конвейеру находить вывод до tr '\n' :.

1 голос
/ 15 июля 2014

Я сделал это так:

import os
import sys

all_modules = {} #keeps track of the module names

def discoverModules():
    ''' Populates a dictionary holding every module name in the directory tree that this file is run '''    
    global all_modules

    for dirname, dirnames, filenames in os.walk('.'):
        # Advanced usage:
        # editing the 'dirnames' list will stop os.walk() from recursing into there.
        if '.git' in dirnames:
            # don't go into any .git directories.
            dirnames.remove('.git')

        # save path to all subdirectories in the sys.path so we can easily access them:
        for subdirname in dirnames:                    
            name = os.path.join(dirname, subdirname) # complete directory path
            sys.path.append(name) # add every entry to the sys.path for easy import

        # save path to all filenames:
        for filename in filenames:        
            # we want to save all the .py modules, but nothing else:
            if '.py' in filename and '.pyc' not in filename and '__init__' not in filename:
                moduleName = '' #this will hold the final module name

                # If on Mac or Linux system:
                if str(os.name) == 'posix': 
                    for element in dirname.split('\/'): # for each folder in the traversal
                        if element is not '.': # the first element is always a '.', so remove it
                            moduleName += element + '.' # add a '.' between each folder

                # If on windoze system:
                elif str(os.name) == 'nt': 
                    for element in dirname.split('\\'): # for each folder in the traversal
                        if element is not '.': # the first element is always a '.', so remove it
                            moduleName += element + '.' # add a '.' between each folder

                # Important to use rstrip, rather than strip. If you use strip, it will remove '.', 'p', and 'y' instead of just '.py'
                moduleName += filename.rstrip('.py') # finally, add the filename of the module to the name, minus the '.py' extension            
                all_modules[str(filename.rstrip('.py'))] = moduleName # add complete module name to the list of modules
    print 'Discovering Modules...Complete!'
    print 'Discovered ' + str(len(all_modules)) + ' Modules.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...