Значок пиктограммы Python не может открыть другие файлы [duplicate]

Я думаю, вы могли бы использовать TIMESTAMPDIFF (unit, datetime_expr1, datetime_expr2) что-то вроде

select * from MyTab T where
TIMESTAMPDIFF(MINUTE,T.runTime,NOW()) > 20

113
задан dln385 6 July 2015 в 19:25
поделиться

4 ответа

Я всегда использую:

__location__ = os.path.realpath(
    os.path.join(os.getcwd(), os.path.dirname(__file__)))

вызов join() добавляет текущий рабочий каталог, но в документации говорится, что если какой-то путь является абсолютным, все остальные пути, оставшиеся от него, будут удалены. Поэтому getcwd() отбрасывается, когда dirname(__file__) возвращает абсолютный путь.

Кроме того, вызов realpath разрешает символические ссылки, если они найдены. Это позволяет избежать проблем при развертывании с помощью setuptools в системах Linux (сценарии привязаны к /usr/bin/ - по крайней мере, на Debian).

Вы можете использовать следующее для открытия файлов в одной папке:

f = open(os.path.join(__location__, 'bundled-resource.jpg'));
# ...

Я использую это для объединения ресурсов с несколькими приложениями Django как в Windows, так и в Linux, и он работает как прелесть!

128
ответ дан André Caron 16 August 2018 в 12:09
поделиться
  • 1
    Если __file__ не может быть использован, используйте sys.argv[0] вместо dirname(__file__). Остальное должно работать так, как ожидалось. Мне нравится использовать __file__, потому что в коде библиотеки sys.argv[0] может вообще не указывать на ваш код, особенно если он импортируется через какой-то сторонний скрипт. – André Caron 30 October 2010 в 20:17
  • 2
    Проблема с этим заключается в том, что он будет изменяться, если вы запускаете файл из прерывателя напрямую или если он импортируется. См. Мой ответ за различия между файлом и sys.argv [0] – Zimm3r 30 October 2010 в 23:03
  • 3
    Так правильно ли говорить, что вариант, описанный в ответе Zimm3r, решается с помощью realpath( join( getcwd(), dirname(__file__) )), как описано здесь? – pianoJames 18 December 2017 в 17:45

Я бы сделал это следующим образом:

from os.path import abspath, exists

f_path = abspath("fooabar.txt")

if exists(f_path):
    with open(f_path) as f:
        print f.read()

Вышеприведенный код строит абсолютный путь к файлу с помощью abspath и эквивалентен использованию normpath(join(os.getcwd(), path)) [это от пидоков]. Затем он проверяет, существует ли этот файл на самом деле , а затем использует диспетчер контекстов для его открытия, поэтому вам не нужно забывать, чтобы закрыть связь с дескриптором файла. ИМХО, делая это таким образом, в долгосрочной перспективе сэкономит вам много боли.

3
ответ дан dcolish 16 August 2018 в 12:09
поделиться
  • 1
    Это не отвечает на вопрос плаката. dln385 специально сказал, что os.path.abspath не разрешает пути к файлам в той же папке, что и скрипт, если скрипт не находится в текущем каталоге. – André Caron 30 October 2010 в 20:35
  • 2
    AH! Я предположил, что пользователь запускает этот скрипт в том же каталоге, что и файл, который они хотели прочитать, NOT в модуле dir чего-то в PYTHONPATH. Это научит меня делать предположения ... – dcolish 30 October 2010 в 20:40
  • 3
    – Jean-François Fabre 2 October 2018 в 19:44

Для цитирования из документации Python:

Как инициализировано при запуске программы, первым элементом этого списка является путь [0], это каталог, содержащий скрипт, который использовался для вызова Python-интерпретатор. Если каталог сценария недоступен (например, если интерпретатор вызывается интерактивно или если скрипт считывается со стандартного ввода), путь [0] - это пустая строка, которая сначала направляет Python на поиск модулей в текущем каталоге. Обратите внимание, что каталог сценариев вставлен перед вставками в результате PYTHONPATH.

sys.path [0] - это то, что вы ищете.

24
ответ дан RED MONKEY 16 August 2018 в 12:09
поделиться
  • 1
    И для полного пути файла: os.path.join(sys.path[0], 'some file.txt'). Это должно корректно обрабатывать пробелы и косые черты во всех системах. – P1h3r1e3d13 13 September 2016 в 04:00
  • 2
    Этот ответ на первый вопрос, а не тот, который после EDIT. – mcoolive 17 June 2017 в 20:37

Хорошо, вот что я делаю.

sys.argv всегда то, что вы вводите в терминал или используете в качестве пути к файлу при выполнении его с помощью python.exe или pythonw.exe

Например, вы можете запустить файл text.py несколькими способами, каждый из них даст вам другой ответ, который всегда дает вам путь, на который был набран python.

    C:\Documents and Settings\Admin>python test.py
    sys.argv[0]: test.py
    C:\Documents and Settings\Admin>python "C:\Documents and Settings\Admin\test.py"
    sys.argv[0]: C:\Documents and Settings\Admin\test.py

Хорошо, вы знаете, что можете получить файл имя, большое дело, теперь, чтобы получить каталог приложений, который вы можете знать, используйте os.path, а именно abspath и dirname

    import sys, os
    print os.path.dirname(os.path.abspath(sys.argv[0]))

. Это выведет это:

   C:\Documents and Settings\Admin\

it всегда будет выводить это независимо от того, вводите ли вы python test.py или python «C: \ Documents and Settings \ Admin \ test.py»

Проблема с использованием __file__ Рассмотрим эти два файла test.py

import sys
import os

def paths():
        print "__file__: %s" % __file__
        print "sys.argv: %s" % sys.argv[0]

        a_f = os.path.abspath(__file__)
        a_s = os.path.abspath(sys.argv[0])

        print "abs __file__: %s" % a_f
        print "abs sys.argv: %s" % a_s

if __name__ == "__main__":
    paths()

import_test.py

import test
import sys

test.paths()

print "--------"
print __file__
print sys.argv[0]

Вывод «python test.py»

C:\Documents and Settings\Admin>python test.py
__file__: test.py
sys.argv: test.py
abs __file__: C:\Documents and Settings\Admin\test.py
abs sys.argv: C:\Documents and Settings\Admin\test.py

Вывод «python test_import.py»

C:\Documents and Settings\Admin>python test_import.py
__file__: C:\Documents and Settings\Admin\test.pyc
sys.argv: test_import.py
abs __file__: C:\Documents and Settings\Admin\test.pyc
abs sys.argv: C:\Documents and Settings\Admin\test_import.py
--------
test_import.py
test_import.py

Так как вы можете видеть файл, вы всегда получаете файл python, из которого он запускается, где sys.argv [0] дает вам файл, который вы использовали из интерпретации всегда. В зависимости от ваших потребностей вам нужно будет выбрать, какой из них лучше всего подходит вашим потребностям.

16
ответ дан Zimm3r 16 August 2018 в 12:09
поделиться
  • 1
    Это подробное доказательство того, что реализация отражает документацию. __file__ является Предполагаемый , чтобы всегда указывать путь к текущему файлу & quot ;, а sys.argv[0] - это Предполагаемый , чтобы всегда указывать путь к сценарию, который инициировал процесс ". В любом случае использование __file__ в скрипте, который вызывается, всегда дает вам точные результаты. – André Caron 31 October 2010 в 02:06
  • 2
    Я просто указывал на это и давал что-то, чтобы показать это. – Zimm3r 2 November 2010 в 20:42
  • 3
    Если у вас есть ссылка на __file__ на верхнем уровне скрипта, он будет работать так, как ожидалось. – Matthew Schinckel 13 April 2012 в 02:20
Другие вопросы по тегам:

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