У меня есть пакет, который использует один временный файл, и этот файл записывается и загружается с помощью функций пакета. Проблема в том, что я использую этот пакет с функциями Azure, и вам разрешено писать там только в специальное место. Как я могу заставить этот пакет писать в это место? Путь определяется внутри пакета как глобальная переменная:
### foo_package.py ###
path = 'file.json'
def read_file():
with open(path, "r") as file:
json_data = json.load(file)
def save_file(json_data):
with open(path, "w") as file:
json.dump(json_data, file)
def foo_function():
file = load_file()
...
save_file(json_data)
### my_code.py ###
from foo_package import foo_function
foo_function() # writes to ./, but i need to write to /some/path
Я имею в виду, раз уж вы написали «временный файл», вам действительно нужен настоящий файл? Разве это не решит вашу проблему, если просто хранить данные в оперативной памяти?
Почему вы не можете импортировать путь и изменить его соответствующим образом?
Как говорит SIGHUP, просто импортируйте foo_package и измените этот путь на любой, какой захотите. foo_package.path = '/my/custom/path'
@Jeyekomon Это не сработает. Проверьте область видимости переменных в Python.
@MykolaZotko Назначение пути будет работать. Пожалуйста, покажите код, где, по вашему мнению, он не будет работать.






Поскольку path указан как относительный путь к 'file.json', вы можете изменить свой рабочий каталог с помощью os.chdir перед вызовом foo_function и при необходимости изменить рабочий каталог обратно:
### my_code.py ###
import os
from foo_package import foo_function
cwd = os.getcwd()
os.chdir('/some/path')
foo_function()
os.chdir(cwd)
Зачем вам это делать, если вы можете просто назначить путь
@SIGHUP Потому что этот подход более надежен. Представьте, используется ли эта функция в других модулях и внутри других функций.
@MykolaZotko "более надежный"? Почему?
my_package.pypath = "/my/path"
def f():
print(path)
main.pyfrom my_package import f
from unittest.mock import patch
f() # prints '/my/path'
with patch("my_package.path", "foo"):
f() # prints 'foo'
Я думаю, что это хороший подход для тестирования, но не для производства.
Я думаю, вы все усложняете, чем есть на самом деле.
Допустим, у нас есть foomod.py вот так:
path = "banana"
def read_file():
print("Reading", path)
Теперь в каком-то другом скрипте мы хотим, чтобы foomod.read_file() работал с другим путем.
import foomod
foomod.read_file()
foomod.path = __file__ # assign some other filename/path
foomod.read_file()
Выход:
Reading banana
Reading /Users/SIGHUP/Python/Jun21.py
можно ли будет записать объект в памяти, подобный файлу, например экземпляр
io.StringIO?