jolly-nail-18749
03/12/2024, 9:07 AMglamorous-carpet-83516
03/12/2024, 9:20 AMdamp-lion-88352
03/12/2024, 9:22 AMdamp-lion-88352
03/12/2024, 9:22 AMjolly-nail-18749
03/12/2024, 11:37 AMdamp-lion-88352
03/13/2024, 10:46 AMdamp-lion-88352
03/13/2024, 10:46 AMhow to setup
and test your python raw container taskdamp-lion-88352
03/13/2024, 10:46 AMjolly-nail-18749
03/13/2024, 11:27 AMdamp-lion-88352
03/13/2024, 11:34 AMdamp-lion-88352
03/13/2024, 11:34 AMbig-baker-90693
03/14/2024, 3:23 AMdamp-lion-88352
03/14/2024, 12:33 PMbig-baker-90693
03/15/2024, 2:59 AMdamp-lion-88352
03/15/2024, 2:59 AMdamp-lion-88352
03/15/2024, 3:00 AMdamp-lion-88352
03/15/2024, 3:00 AMbig-baker-90693
03/15/2024, 3:00 AMdamp-lion-88352
03/15/2024, 3:00 AMdamp-lion-88352
03/15/2024, 3:00 AMbig-baker-90693
03/15/2024, 3:01 AMjolly-nail-18749
03/15/2024, 3:02 PMfrom flytekit import ContainerTask, dynamic, kwtypes
from flytekit.types.file import FlyteFile
task_1 = ContainerTask(
name="task1",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
inputs=kwtypes(infile=FlyteFile, param1=str, param2=float),
outputs=kwtypes(out=FlyteFile),
image="my_image1:0.0.1",
command=[
"python",
"test_script1.py",
"/var/inputs/infile",
"/var/outputs/out",
"{{.inputs.param1}}",
"{{.inputs.param2}}",
],
)
task_2 = ContainerTask(
name="task2",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
inputs=kwtypes(infile=FlyteFile, param1=str, param2=float),
outputs=kwtypes(out=FlyteFile),
image="my_image2:0.0.1",
command=[
"python",
"test_script2.py",
"/var/inputs/infile",
"/var/outputs/out",
"{{.inputs.param1}}",
"{{.inputs.param2}}",
],
)
@dynamic
def local_test(input_file: FlyteFile) -> FlyteFile:
param1 = "some random string"
param2 = 42.0
file1 = task_1(infile=input_file, param1=param1, param2=param2)
file2 = task_2(infile=file1, param1=param1, param2=param2)
return file2
jolly-nail-18749
03/15/2024, 3:09 PMdamp-lion-88352
03/16/2024, 12:31 AMdamp-lion-88352
03/16/2024, 12:31 AMdamp-lion-88352
03/16/2024, 12:31 AMdamp-lion-88352
03/16/2024, 12:32 AMdamp-lion-88352
03/16/2024, 1:20 AMdamp-lion-88352
03/16/2024, 1:20 AMjolly-nail-18749
03/16/2024, 7:53 AMdamp-lion-88352
03/18/2024, 11:36 AMdamp-lion-88352
03/18/2024, 11:37 AMint, str, float, bool, datetime.datetime, FlyteDirectory and FlyteFile
damp-lion-88352
03/18/2024, 11:37 AMdamp-lion-88352
03/18/2024, 11:38 AMdamp-lion-88352
03/18/2024, 11:38 AMjolly-nail-18749
03/19/2024, 1:30 PMfrom flytekit import ContainerTask, kwtypes, workflow
from flytekit.types.file import FlyteFile
python_return_same_values = ContainerTask(
name="python_return_same_values",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
outputs=kwtypes(out=FlyteFile),
image="myimage:1",
command=[
"python",
"myscript.py",
"/var/outputs/out",
],
)
@workflow
def wf() -> FlyteFile:
return python_return_same_values()
if __name__ == "__main__":
print(wf())
and myscript.py
import sys
from pathlib import Path
def write_output(out_path: Path):
out_path.write_text("dgklsjljs")
if __name__ == "__main__":
write_output(Path(sys.argv[1]))
And Dockerfile:
FROM python:3.9-slim-bullseye
WORKDIR /root
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONPATH /root
# Virtual environment
ENV VENV /opt/venv
RUN python3 -m venv ${VENV}
ENV PATH="${VENV}/bin:$PATH"
COPY myscript.py /root/myscript.py
# This tag is supplied by the build script and will be used to determine the version
# when registering tasks, workflows, and launch plans
ARG tag
ENV FLYTE_INTERNAL_IMAGE $tag
damp-lion-88352
03/20/2024, 1:09 AMdamp-lion-88352
03/20/2024, 9:04 AMFlytefile
as inputdamp-lion-88352
03/20/2024, 9:05 AMFlyteDirectroy
too and push itdamp-lion-88352
03/20/2024, 11:03 AMdamp-lion-88352
03/20/2024, 11:03 AMdamp-lion-88352
03/20/2024, 11:03 AMjolly-nail-18749
03/21/2024, 4:12 PMdamp-lion-88352
03/21/2024, 4:17 PMtest_script1.py
and test_script2.py
?damp-lion-88352
03/21/2024, 4:17 PMjolly-nail-18749
03/21/2024, 4:22 PMfrom flytekit import ContainerTask, kwtypes, workflow
from flytekit.types.file import FlyteFile
task1 = ContainerTask(
name="task1",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
inputs=kwtypes(infile=FlyteFile, str_param=str, float_param=float),
outputs=kwtypes(out=FlyteFile),
image="docker:1",
command=[
"python",
"script1.py",
"/var/inputs/infile",
"/var/outputs/out",
"{{.inputs.str_param}}",
"{{.inputs.float_param}}",
],
)
task2 = ContainerTask(
name="task2",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
inputs=kwtypes(infile=FlyteFile, str_param=str, float_param=float),
outputs=kwtypes(out=FlyteFile),
image="docker:2",
command=[
"python",
"script2.py",
"/var/inputs/infile",
"/var/outputs/out",
"{{.inputs.str_param}}",
"{{.inputs.float_param}}",
],
)
@workflow
def wf(input_file: FlyteFile) -> FlyteFile:
str_param = "..."
float_param = 25.0
file1 = task1(infile=input_file, str_param=str_param, float_param=float_param)
file2 = task2(infile=file1, str_param=str_param, float_param=float_param)
return xml_file # type: ignore
damp-lion-88352
03/21/2024, 4:23 PMdamp-lion-88352
03/25/2024, 2:27 PMss ss
, will be ss
.
does this cause the bug?damp-lion-88352
03/25/2024, 2:29 PMscript1.py
and script2.py
?
Since I've tested flytefile
as input and output and both case works for me, so I think there's a little bit chance that the example is wrong, or please confirm that it works remotelyjolly-nail-18749
03/25/2024, 5:19 PMpyflyte run test_wf.py run_test --file test_wf.py
produces the following output: input file exists: False
test_wf.py:
from pathlib import Path
from flytekit import ContainerTask, dynamic, kwtypes, task
from flytekit.types.file import FlyteFile
test_ct = ContainerTask(
name="ct1",
input_data_dir="/var/inputs",
output_data_dir="/var/outputs",
inputs=kwtypes(infile=FlyteFile),
outputs=kwtypes(out=FlyteFile),
image="myimage:0.1",
command=[
"python",
"script1.py",
"/var/inputs/infile",
"/var/outputs/out",
],
)
@task
def to_str(file: FlyteFile) -> str:
f = Path(file.download())
return f.read_text()
@dynamic
def run_test(file: FlyteFile) -> str:
out_file = test_ct(infile=file)
return to_str(file=out_file)
script1.py:
from pathlib import Path
from sys import argv
def check_exists(input_path: Path, output_path: Path) -> None:
output_path.write_text(f"input file exists: {input_path.exists()}")
if __name__ == "__main__":
check_exists(Path(argv[1]), Path(argv[2]))
damp-lion-88352
03/27/2024, 1:44 AMdamp-lion-88352
03/27/2024, 1:44 AMdamp-lion-88352
03/27/2024, 1:45 AMdirect file paths
, but only support template-style references
damp-lion-88352
03/27/2024, 1:45 AMdamp-lion-88352
03/27/2024, 1:46 AMdamp-lion-88352
03/27/2024, 1:46 AMjolly-nail-18749
03/27/2024, 8:34 AMdamp-lion-88352
03/27/2024, 8:51 AMdamp-lion-88352
03/27/2024, 8:51 AMdamp-lion-88352
03/27/2024, 8:51 AMdamp-lion-88352
03/27/2024, 8:51 AMglamorous-carpet-83516
03/27/2024, 4:48 PMjolly-nail-18749
04/01/2024, 8:08 AM