Creating a Pipfile which has different installation instructions depending on operating systems (PyTorch v0.4.1 as an example)
Tags: python, pipenv, pytorch
Published: 2018-08-10 10:24:12

---
title: Creating a Pipfile which has different installation instructions depending on operating systems (PyTorch v0.4.1 as an example)
published: true
description: 
tags: python, pipenv, pytorch
---

###### (A Japanese translation is available [here](https://qiita.com/TomoyukiAota/items/5fe5b1d1a4e9fc475cf4).)

In this article, I'm going to describe how to create a Pipfile when we have different installation instructions depending on operating systems.

As an actual example, I'm going to create a Pipfile which can be used on both macOS/Windows for [PyTorch](https://pytorch.org/) v0.4.1.


# Introduction

For most Python packages, installation instructions are the same regardless of operating systems. For example, `numpy` can be installed like this:

```
pipenv install numpy
``` 

However, there are some packages which has different installation instructions depending on operating systems. For example, [PyTorch](https://pytorch.org/) v0.4.1 is installed by the following command on macOS:

```
pipenv install torch
```

On Windows, it is installed like this:

```
pipenv install http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl 

```

(In this example, I assume the installation of PyTorch is for Python 3.6 without CUDA.)

In Pipfile, we need to let the former instruction run on macOS and let the latter instruction run on Windows. How can we achieve it?


# Solution

Specify `sys_platform` depending on operating systems. [In the official document of Pipenv](https://docs.pipenv.org/advanced/#specifying-basically-anything), the case of installing `pywinusb` only on Windows is described.

For PyTorch v0.4.1, the Pipfile I actually use is like this:


```
[[source]]

url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"


[packages]

theano = "*"
tensorflow = "*"
keras = "*"
numpy = "*"
scipy = "*"
matplotlib = "*"
seaborn = "*"
jupyter = "*"
jupyterlab = "*"
ipython = "*"
pandas = "*"
scikit-learn = "*"
spyder = "*"
pillow = "*"
torch = {version = "==0.4.1", sys_platform = "== 'darwin'"}
"b4b7455" = {file = "http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl", sys_platform = "== 'win32'"}
torchvision = "*"


[dev-packages]

pylint = "*"


[requires]

python_version = "3.6"
```

In `[packages]`, there are two lines for PyTorch v0.4.1.

```
torch = {version = "==0.4.1", sys_platform = "== 'darwin'"}
"b4b7455" = {file = "http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl", sys_platform = "== 'win32'"}
```

In these lines, `sys_platform = "== 'darwin'"` specifies that this is only for macOS, and `sys_platform = "== 'win32'"` specifies that this is only for Windows.

By the way, `"b4b7455"` is written on Pipfile when `pipenv install http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-win_amd64.whl` is executed on Windows. I added `sys_platform = "== 'win32'"` then.

In GitHub, I created a repository, [pipenv_cross-platform_example](https://github.com/TomoyukiAota/pipenv_cross-platform_example), and put Pipfile and Pipfile.lock there, so this repository may be useful as an example.