Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 11, 2012 17:40:06

agryn
От: Украина
Зарегистрирован: 2011-12-14
Сообщения: 189
Репутация: +  0  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

configfilename = 'config.ini'
cfgfile = open(os.getcwd() + '\\' + configfilename)
Нужно что б в разных осях конфигурационный файл открывался без заморочки с слешем
в принципе можно сначала установить платформу а потом добавить необходимый слеш, но есть ли возможность без заморочек.
Может есть другой способ открыть конфигурационный файл что лежит в каталоге со скриптом.

Отредактировано agryn (Сен. 11, 2012 17:41:43)

Офлайн

#2 Сен. 11, 2012 17:51:00

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

http://docs.python.org/library/os.path.html#os.path.join

А вообще, если файл лежит в каталоге со скриптом, и скрипт запускается из него, то

cfgfile = open(configfilename)

Офлайн

#3 Сен. 11, 2012 19:25:29

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

__file__
os.path.abspath

А вообще есть такая вещь как settings.py/config.py, всё делается просто импортом.



Офлайн

#4 Сен. 12, 2012 22:06:36

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

Тут можно взять “правильный” слеш:

>>> import os
>>> os.sep
'/'
для linux

а вообще вроде под виндой питон нормально работает с “/” (как и в nix/mac), на py 2,6 проверял, но лучше юзать os.sep

Офлайн

#5 Сен. 13, 2012 06:14:16

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

configfilename = 'config.ini'
cfgfile = open(os.path.join(os.path.dirname(__file__), configfilename))



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Сен. 13, 2012 06:17:49

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

fata1ex
А вообще есть такая вещь как settings.py/config.py, всё делается просто импортом.
Сисадмины вас проклянут. Вот в большинстве php cms конфиги сделаны таким импортом, понадобилось утильку написать - данные из конфигов извлекать, так единственный выход был вызывать php из консоли, в нем исполнять скрипт, что импортирует конфиг и печатает в виде JSON на экран, потом вывод парсить, уууууу….



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Сен. 13, 2012 13:29:24

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

PooH
configfilename = 'config.ini' 
cfgfile = open(os.path.join(os.path.dirname(__file__), configfilename))

И ловим факап на двойке, если в пути есть символы, которых нет в текущей кодовой таблице, т.к. sys.argv в двойке - str (я юзал sys.argv, буду считать, что это одно и то же).

Я читал, что __file__ не везде работает. И что лучше - dirname или abspath? Какой самый корректный вариант открытия файлов в каталоге програмы?

o7412369815963
а вообще вроде под виндой питон нормально работает с “/” (как и в nix/mac), на py 2,6 проверял, но лучше юзать os.sep
Вопрос в догонку - а можно ли в конфигах сохранять пути с сепаратором, или надо мудрячить с os.path.join? А \ на линупсе будет работать?

Офлайн

#8 Сен. 13, 2012 17:39:48

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

odnochlen
Я читал, что __file__ не везде работает. И что лучше - dirname или abspath? Какой самый корректный вариант открытия файлов в каталоге програмы?
Не знаю самый ли корректный, но делаю так:
import os
import sys
 
def program_path():
    main_file = unicode(sys.argv[0], sys.getfilesystemencoding())
    return os.path.realpath(os.path.dirname(main_file))
На выходе Юникодовый путь до папки с программой, даже если это .exe сделанный cxFreeze и т.п.

odnochlen
Вопрос в догонку - а можно ли в конфигах сохранять пути с сепаратором, или надо мудрячить с os.path.join
Наверное, лучше сохранять с прямым слэшем, а потом на крайний случай использовать os.path.normpath(path)
os.path.normpath(path)
Normalize a pathname. This collapses redundant separators and up-level references so that A//B, A/B/, A/./B and A/foo/../B all become A/B.

It does not normalize the case (use normcase() for that). On Windows, it converts forward slashes to backward slashes. It should be understood that this may change the meaning of the path if it contains symbolic links!

Но Win нормально с ‘/’ работает.

odnochlen
А \ на линупсе будет работать?
нет
ubuntu@devbox:~$ python
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open(r"tmp\test.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'tmp\\test.txt'
>>> f = open(r"tmp/test.txt")
>>> f
<open file 'tmp/test.txt', mode 'r' at 0xb73dfe38>

Отредактировано reclosedev (Сен. 13, 2012 17:40:32)

Офлайн

#9 Сен. 13, 2012 21:26:47

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

os.getcwd() разные слеши в разных осях

Еще DOS прекрасно работал с ‘/’.
Так же как и все соответсвующие WinAPI.

004011C8   . 68 00000080    PUSH 80000000                            ; |Access = GENERIC_READ
004011CD . 68 75384000 PUSH test.00403875 ; |FileName = "D:/temp/test/test.mpt"
004011D2 . E8 A7090000 CALL <JMP.&kernel32.CreateFileA> ; \CreateFileA
Другое дело, что вызов WinAPI возвращает пути с ‘\’. Ну и всякие приложения/утилиты могут заартачится, если шибко умный “проггер” встроил соответсвующию проверку


Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version