Переопределить пространство имен в Python

Я знаю, что очень поздно в этот день ответить на этот вопрос, но я обнаружил, что ни один из ответов не был так полезен для меня, как мое собственное решение. Очень простой способ получить путь от вашего CWD к вашей папке bin выглядит следующим образом:

int main(int argc, char* argv[])
{
    std::string argv_str(argv[0]);
    std::string base = argv_str.substr(0, argv_str.find_last_of("/"));
}

Теперь вы можете просто использовать это как базу для своего относительного пути. Так, например, у меня есть эта структура каталогов:

main
  ----> test
  ----> src
  ----> bin

, и я хочу скомпилировать свой исходный код в bin и записать журнал для проверки. Я могу просто добавить эту строку в свой код.

std::string pathToWrite = base + "/../test/test.log";

Я пробовал этот подход в Linux, используя полный путь, псевдоним и т. д., и он отлично работает.

ПРИМЕЧАНИЕ:

Если вы находитесь в окнах, вы должны использовать '\' в качестве разделителя файлов не '/'. Вам также придется избегать этого, например:

std::string base = argv[0].substr(0, argv[0].find_last_of("\\"));

Я думаю, что это должно работать, но не проверено, поэтому комментарий будет оценен, если он работает, или исправить, если нет.

13
задан Peter Mortensen 2 November 2014 в 03:13
поделиться

3 ответа

Сначала вы импортируете его с помощью import :

>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

Затем убедитесь, что этот модуль известен Python как project :

>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')

После при этом любой импортирующий проект в текущем сеансе Python получит исходный модуль

>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>

. Это будет работать также для подмодулей: если у вас есть файл foobar.py в том же месте, вы получите

>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>

Дополнение. Вот что я использую:

>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
19
ответ дан 1 December 2019 в 17:21
поделиться

Конечно, project = __import __ ('a40bd22344') после того, как sys.path установлен правильно, будет работать.

Предположим, вы хотите сделайте это в функции, взяв в качестве аргумента полный путь и правильно установив глобальный импорт проекта (а также волшебным образом заставив import project работать впоследствии в других модули). Кусок пирога:

def weirdimport(fullpath):
  global project

  import os
  import sys
  sys.path.append(os.path.dirname(fullpath))
  try:
      project = __import__(os.path.basename(fullpath))
      sys.modules['project'] = project
  finally:
      del sys.path[-1]

при этом также остается sys.path в том виде, в каком он был обнаружен.

17
ответ дан 1 December 2019 в 17:21
поделиться

Вот один из способов сделать это, не касаясь sys.path, используя модуль imp в Python:

import imp

f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)

project.some_func()

Вот ссылка на хорошую документацию по imp модуль:

25
ответ дан 1 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: