Несколько предложений-
Во-первых, убедитесь, что вы используете фактический метод self.output().open()
вместо переноса open(self.output().path)
.Это теряет «атомарность» целей luigi, плюс предполагается, что эти цели можно заменять, поэтому, если вы вернетесь обратно к aa LocalTarget
, ваш код должен работать так же.Вы позволяете определенному целевому классу обрабатывать, что означает открыть файл.Полученная ошибка выглядит так, будто python пытается найти локальный путь, который, очевидно, не работает.
Во-вторых, я только что столкнулся с той же проблемой, поэтому вот мое решение подключено к этому коду:
from luigi import format
class ModelTrain(luigi.Task):
def output(self):
client = S3Client(os.getenv("CONFIG_AWS_ACCESS_KEY"),
os.getenv("CONFIG_AWS_SECRET_KEY"))
model_output = os.path.join(
"s3://", _BUCKET, exp.version + '_model.joblib')
# Use luigi.format.Nop for binary files
return S3Target(model_output, client, format=format.Nop)
def run(self):
# where does `model` come from?
with self.output().open('w') as s3_f:
joblib.dump(model, s3_f)
Моя задача использует pickle
, поэтому мне пришлось следовать чему-то похожему на этот пост для повторного импорта.
class MyNextTask(Task):
...
def run(self):
with my_pickled_task.output().open() as f:
# The S3Target implements a read method and then I can use
# the `.loads()` method to import from a binary string
results = pickle.loads(f.read())
... do more stuff with results ...
Я признаю, что этот пост устарел, но я нашел решение, которое нашел там для следующей бедной души, пытающейся сделать то же самое.