Я знаю, что очень поздно в этот день ответить на этот вопрос, но я обнаружил, что ни один из ответов не был так полезен для меня, как мое собственное решение. Очень простой способ получить путь от вашего 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("\\"));
Я думаю, что это должно работать, но не проверено, поэтому комментарий будет оценен, если он работает, или исправить, если нет.
Сначала вы импортируете его с помощью 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)]
Конечно, 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 в том виде, в каком он был обнаружен.
Вот один из способов сделать это, не касаясь 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
модуль: