An installation and dependency system for Python

Overview

crates.io version Build Status

Pyflow

Simple is better than complex - The Zen of Python

Pyflow streamlines working with Python projects and files. It's an easy-to-use CLI app with a minimalist API. Never worry about having the right version of Python or dependencies.

Example use, including setting up a project and switching Py versions: Demonstration

If your project's already configured, the only command you need is pyflow, or pyflow myscript.py; setting up Python and its dependencies are automatic.

Goals: Make using and publishing Python projects as simple as possible. Actively managing Python environments shouldn't be required to use dependencies safely. We're attempting to fix each stumbling block in the Python workflow, so that it's as elegant as the language itself.

You don't need Python or any other tools installed to use Pyflow.

It runs standalone scripts in their own environments with no config, and project functions directly from the CLI.

It implements PEP 582 -- Python local packages directory and Pep 518 (pyproject.toml).

Installation

  • Windows - Download and run this installer. Or, if you have Scoop installed, run scoop install pyflow.

  • Ubuntu, or another Os that uses Snap - Run snap install pyflow --classic.

  • Ubuntu or Debian without Snap - Download and run this deb.

  • Fedora, CentOs, RedHat, or older versions of SUSE - Download and run this rpm.

  • A different Linux distro - Download this standalone binary and place it somewhere accessible by the PATH. For example, /usr/bin.

  • Mac - Download this zipped Mac binary , ance place the file in it somewhere accessible by the PATH. (Props to @russeldavis for building this)

  • With Pip - Run pip install pyflow. The linux install using this method is much larger than with the above ones, and it doesn't yet work with Mac. This method will likely not work with Red Hat, CentOs, or Fedora.

  • If you have Rust installed - Run cargo install pyflow.

Quickstart

  • (Optional) Run pyflow init in an existing project folder, or pyflow new projname to create a new project folder. init imports data from requirements.txt or Pipfile; new creates a folder with the basics.
  • Run pyflow install requests etc to install packages. Alternatively, edit pyproject.toml directly.
  • Run pyflow or pyflow myfile.py to run Python.

Quick-and-dirty start for quick-and-dirty scripts

  • Add the line __requires__ = ['numpy', 'requests'] somewhere in your script, where numpy and requests are dependencies. Run pyflow script myscript.py, where myscript.py is the name of your script. This will set up an isolated environment for this script, and install dependencies as required. This is a safe way to run one-off Python files that aren't attached to a project, but have dependencies.

Why add another Python manager?

Pipenv, Poetry, and Pyenv address parts of Pyflow's raison d'être, but expose stumbling blocks that may frustrate new users, both when installing and using. Some reasons why this is different:

  • It behaves consistently regardless of how your system and Python installations are configured.

  • It automatically manages Python installations and environments. You specify a Python version in pyproject.toml (if omitted, it asks), and it ensures that version is used. If the version's not installed, Pyflow downloads a binary, and uses that. If multiple installations are found for that version, it asks which to use. Pyenv can be used to install Python, but only if your system is configured in a certain way: I don’t think expecting a user’s computer to compile Python is reasonable.

  • By not using Python to install or run, it remains environment-agnostic. This is important for making setup and use as simple and decision-free as possible. It's common for Python-based CLI tools to not run properly when installed from pip due to the PATH or user directories not being configured in the expected way.

  • Its dependency resolution and locking is faster due to using a cached database of dependencies, vice downloading and checking each package, or relying on the incomplete data available on the pypi warehouse. Pipenv’s resolution in particular may be prohibitively-slow on weak internet connections.

  • It keeps dependencies in the project directory, in __pypackages__. This is subtle, but reinforces the idea that there's no hidden state.

  • It will always use the specified version of Python. This is a notable limitation in Poetry; Poetry may pick the wrong installation (eg Python2 vice Python3), with no obvious way to change it. Poetry allows projects to specify version, but neither selects, nor provides a way to select the right one. If it chooses the wrong one, it will install the wrong environment, and produce a confusing error message. This can be worked around using Pyenv, but this solution isn't documented, and adds friction to the workflow. It may confuse new users, as it occurs by default on popular linux distros like Ubuntu. Additionally, Pyenv's docs are confusing: It's not obvious how to install it, what operating systems it's compatible with, or what additional dependencies are required.

  • Multiple versions of a dependency can be installed, allowing resolution of conflicting sub-dependencies. (ie: Your package requires Dep A>=1.0 and Dep B. Dep B requires Dep A==0.9) There are many cases where Poetry and Pipenv will fail to resolve dependencies. Try it for yourself with a few random dependencies from pypi; there's a good chance you'll hit this problem using Poetry or Pipenv. Limitations: This will not work for some compiled dependencies, and attempting to package something using this will trigger an error.

Perhaps the biggest philosophical difference is that Pyflow abstracts over environments, rather than expecting users to manage them.

My OS comes with Python, and Virtual environments are easy. What's the point of this?

Hopefully we're not replacing one problem with another.

Some people like the virtual-environment workflow - it requires only tools included with Python, and uses few console commands to create, and activate and environments. However, it may be tedious depending on workflow: The commands may be long depending on the path of virtual envs and projects, and it requires modifying the state of the terminal for each project, each time you use it, which you may find inconvenient or inelegant.

I think we can do better. This is especially relevant for new Python users who don't understand venvs, or are unaware of the hazards of working with a system Python.

Pipenv improves the workflow by automating environment use, and allowing reproducible dependency graphs. Poetry improves upon Pipenv's API, speed, and dependency resolution, as well as improving the packaging and distributing process by using a consolidating project config. Both are sensitive to the environment they run in, and won't work correctly if it's not as expected.

Conda addresses these problems elegantly, but maintains a separate repository of binaries from PyPi. If all packages you need are available on Conda, it may be the best solution. If not, it requires falling back to Pip, which means using two separate package managers.

When building and deploying packages, a set of overlapping files are traditionally used: setup.py, setup.cfg, requirements.txt and MANIFEST.in. We use pyproject.toml as the single-source of project info required to build and publish.

A thoroughly biased feature table

These tools have different scopes and purposes:

Name Pip + venv Pipenv Poetry pyenv pythonloc Conda this
Manages dependencies
Resolves/locks deps
Manages Python installations
Py-environment-agnostic
Included with Python
Stores deps with project
Requires changing session state
Clean build/publish flow
Supports old Python versions with virtualenv
Isolated envs for scripts
Runs project fns from CLI

Use

  • Optionally, create a pyproject.toml file in your project directory. Otherwise, this file will be created automatically. You may wish to use pyflow new to create a basic project folder (With a .gitignore, source directory etc), or pyflow init to populate info from requirements.txt or Pipfile. See PEP 518 for details.

Example contents:

[tool.pyflow]
py_version = "3.7"
name = "runcible"
version = "0.2.9"
authors = ["John Hackworth <[email protected]>"]

[tool.pyflow.dependencies]
numpy = "^1.16.4"
diffeqpy = "1.1.0"

The [tool.pyflow] section is used for metadata. The only required item in it is py_version, unless building and distributing a package. The [tool.pyflow.dependencies] section contains all dependencies, and is an analog to requirements.txt. You can specify developer dependencies in the [tool.pyflow.dev-dependencies] section. These won't be packed or published, but will be installed locally. You can install these from the cli using the --dev flag. Eg: pyflow install black --dev

You can specify extra dependencies, which will only be installed when passing explicit flags to pyflow install, or when included in another project with the appropriate flag enabled. Ie packages requiring this one can enable with pip install -e etc.

[tool.pyflow.extras]
test = ["pytest", "nose"]
secure = ["crypto"]

If you'd like to an install a dependency with extras, use syntax like this:

[tool.pyflow.dependencies]
ipython = { version = "^7.7.0", extras = ["qtconsole"] }

To install from a local path instead of pypi, use syntax like this:

[tool.pyflow.dependencies]
# packagename = { path = "path-to-package"}
numpy = { path = "../numpy" }

To install from a git repo, use syntax like this:

[tool.pyflow.dependencies]
saturn = { git = "https://github.com/david-oconnor/saturn.git" }  # The trailing `.git` here is optional.

gitdependencies are currently experimental. If you run into problems with them, please submit an issue.

To install a package that includes a . in its name, enclose the name in quotes.

For details on how to specify dependencies in this Cargo.toml-inspired semver format, reference this guide.

We also attempt to parse metadata and dependencies from tool.poetry sections of pyproject.toml, so there's no need to modify the format if you're using that.

You can specify direct entry points to parts of your program using something like this in pyproject.toml:

[tool.pyflow.scripts]
name = "module:function"

Where you replace name, function, and module with the name to call your script with, the function you wish to run, and the module it's in respectively. This is similar to specifying scripts in setup.py for built packages. The key difference is that functions specified here can be run at any time, without having to build the package. Run with pyflow name to do this.

If you run pyflow package on on a package using this, the result will work like normal script entry points for someone using the package, regardless of if they're using this tool.

What you can do

Managing dependencies:

  • pyflow install - Install all packages in pyproject.toml, and remove ones not (recursively) specified. If an environment isn't already set up for the version specified in pyproject.toml, sets one up. Note that this command isn't required to sync dependencies; any relevant pyflow command will do so automatically.
  • pyflow install requests - If you specify one or more packages after install, those packages will be added to pyproject.toml and installed. You can use the --dev flag to install dev dependencies. eg: pyflow install black --dev.
  • pyflow install numpy==1.16.4 matplotlib>=3.1 - Example with multiple dependencies, and specified versions
  • pyflow uninstall requests - Remove one or more dependencies

Running REPL and Python files in the environment:

  • pyflow - Run a Python REPL
  • pyflow main.py - Run a python file
  • pyflow ipython, pyflow black etc - Run a CLI tool like ipython, or a project function For the former, this must have been installed by a dependency; for the latter, it's specfied under [tool.pyflow], scripts
  • pyflow script myscript.py - Run a one-off script, outside a project directory, with per-file package management

Building and publishing:

  • pyflow package - Package for distribution (uses setuptools internally, and builds both source and wheel.)
  • pyflow package --extras "test all" - Package for distribution with extra features enabled, as defined in pyproject.toml
  • pyflow publish - Upload to PyPi (Repo specified in pyproject.toml. Uses Twine internally.)

Misc:

  • pyflow list - Display all installed packages and console scripts
  • pyflow new projname - Create a directory containing the basics for a project: a readme, pyproject.toml, .gitignore, and directory for code
  • pyflow init - Create a pyproject.toml file in an existing project directory. Pull info from requirements.text and Pipfile as required.
  • pyflow reset - Remove the environment, and uninstall all packages
  • pyflow clear - Clear the cache, of downloaded dependencies, Python installations, or script- environments; it will ask you which ones you'd like to clear.
  • pyflow -V - Get the current version of this tool
  • pyflow help Get help, including a list of available commands

How installation and locking work

Running pyflow install syncs the project's installed dependencies with those specified in pyproject.toml. It generates pyflow.lock, which on subsequent runs, keeps dependencies each package a fixed version, as long as it continues to meet the constraints specified in pyproject.toml. Adding a package name via the CLI, eg pyflow install matplotlib simply adds that requirement before proceeding. pyflow.lock isn't meant to be edited directly.

Each dependency listed in pyproject.toml is checked for a compatible match in pyflow.lock If a constraint is met by something in the lock file, the version we'll sync will match that listed in the lock file. If not met, a new entry is added to the lock file, containing the highest version allowed by pyproject.toml. Once complete, packages are installed and removed in order to exactly meet those listed in the updated lock file.

This tool downloads and unpacks wheels from pypi, or builds wheels from source if none are available. It verifies the integrity of the downloaded file against that listed on pypi using SHA256, and the exact versions used are stored in a lock file.

When a dependency is removed from pyproject.toml, it, and its subdependencies not also required by other packages are removed from the __pypackages__ folder.

How dependencies are resolved

Compatible versions of dependencies are determined using info from the PyPi Warehouse (available versions, and hash info), and the pydeps database. We use pydeps, which is built specifically for this project, due to inconsistent dependency information stored on pypi. A dependency graph is built using this cached database. We attempt to use the newest compatible version of each package.

If all packages are either only specified once, or specified multiple times with the same newest-compatible version, we're done resolving, and ready to install and sync.

If a package is included more than once with different newest-compatible versions, but one of those newest-compatible is compatible with all requirements, we install that one. If not, we search all versions to find one that's compatible.

If still unable to find a version of a package that satisfies all requirements, we install multiple versions of it as-required, store them in separate directories, and modify their parents' imports as required.

Note that it may be possible to resolve dependencies in cases not listed above, instead of installing multiple versions. Ie we could try different combinations of top-level packages, check for resolutions, then vary children as-required down the hierarchy. We don't do this because it's slow, has no guarantee of success, and involves installing older versions of packages.

Not-yet-implemented

  • Installing global CLI tools
  • The lock file is missing some info like hashes
  • Adding a dependency via the CLI with a specific version constraint, or extras.
  • Install packages from a local wheel directly. In the meanwhile, you can use a path dependency of the unpacked wheel.
  • Dealing with multiple-installed-versions of a dependency that uses importlib or dynamic imports
  • Install Python on Mac

Building and uploading your project to PyPi

In order to build and publish your project, additional info is needed in pyproject.toml, that mimics what would be in setup.py. Example:

[tool.pyflow]
name = "everythingkiller"
py_version = "3.6"
version = "0.2.9"
authors = ["Fraa Erasmas <[email protected]>"]
description = "Small, but packs a punch!"
homepage = "https://everything.math"
repository = "https://github.com/raz/everythingkiller"
license = "MIT"
keywords = ["nanotech", "weapons"]
classifiers = [
    "Topic :: System :: Hardware",
    "Topic :: Scientific/Engineering :: Human Machine Interfaces",
]
python_requires = ">=3.6"
# If not included, will default to `test.pypi.org`
package_url = "https://upload.pypi.org/legacy/"


[tool.pyflow.scripts]
# name = "module:function"
activate = "jeejah:activate"


[tool.pyflow.dependencies]
numpy = "^1.16.4"
manimlib = "0.2.9"
ipython = {version = "^7.7.0", extras=["qtconsole"]}


[tool.pyflow.dev-dependencies]
black = "^18.0"

package_url is used to determine which package repository to upload to. If omitted, Pypi test is used (https://test.pypi.org/legacy/).

Other items you can specify in [tool.pyflow]:

  • readme: The readme filename, use this if it's named something other than README.md.
  • build: A python script to execute building non-python extensions when running pyflow package.

Building this from source

If you’d like to build from source, download and install Rust, clone the repo, and in the repo directory, run cargo build --release.

Ie on linux or Mac:

curl https://sh.rustup.rs -sSf | sh
git clone https://github.com/david-oconnor/pyflow.git
cd pyflow
cargo build --release

Updating

  • If installed via Scoop, run scoop update pyflow.
  • If installed via Snap, run snap refresh pyflow.
  • If installed via Cargo, run cargo install pyflow --force.
  • If installed via Pip, run pip install --upgrade pyflow.
  • If using an installer or deb, run the new version's installer or deb. If manually calling a binary, replace it.

Uninstalling

  • If installed via Scoop, run scoop uninstall pyflow.
  • If installed via Snap, run snap remove pyflow.
  • If installed via Cargo, run cargo uninstall pyflow.
  • If installed via Pip, run pip uninstall pyflow.
  • If installed via Windows installer, run the Installer again and select Remove when asked, or use Apps & features.
  • If installed via a deb, useg the Software Center.
  • If manually calling a binary, remove it.

Contributing

If you notice unexpected behavior or missing features, please post an issue, or submit a PR. If you see unexpected behavior, it's probably a bug! Post an issue listing the dependencies that did not install correctly.

Why not to use this

  • It's adding another tool to an already complex field.
  • Most of the features here are already provided by a range of existing packages, like the ones in the table above.
  • The field of contributors is expected to be small, since it's written in a different language.
  • Dependency managers like Pipenv and Poetry work well enough for many cases, have dedicated dev teams, and large userbases.
  • Conda in particular handles many things this does quite well.

Dependency cache repo:

  • Github Example API calls: https://pydeps.herokuapp.com/requests, https://pydeps.herokuapp.com/requests/2.21.0. This pulls all top-level dependencies for the requests package, and the dependencies for version 2.21.0 respectively. There is also a POST API for pulling info on specified versions. The first time this command is run for a package/version combo, it may be slow. Subsequent calls, by anyone, should be fast. This is due to having to download and install each package on the server to properly determine dependencies, due to unreliable information on the pypi warehouse.

Python binary sources:

Repo binaries are downloaded from

  • Windows: Python official Visual Studio package, by Steve Dower.
  • Newer linux distros: Built on Ubuntu 18.04, using standard procedures.
  • Older linux distros: Built on CentOS 7, using standard procedures.

Gotchas

  • Make sure __pypackages__ is in your .gitignore file.
  • You may need to set up IDEs to find packages in __pypackages__. If using PyCharm: SettingsProjectProject InterpreterShow All... → (Select the interpreter, ie (projname)/__pypackages__/3.x/.venv/bin/python on Linux/Mac, or (projname)/__pypackages__/3.x/Scripts/python on Windows) → Click the folder-tree icon at the bottom of the pop-out window → Click the + icon at the bottom of the new pop-out window → Navigate to and select (projname)/__pypackages__/3.x/lib
  • If using VsCode: Settings → search python extra pathsEdit in settings.json → Add or modify the line: "python.autoComplete.extraPaths": ["(projname)/__pypackages__/3.7/lib"]

References

Comments
  • Incomplete package install

    Incomplete package install

    1. Create a new project
    2. Run pyflow install ufolib2
    $ pyflow install ufolib2
    Found lockfile
    ⬇ Installing ufolib2 0.5.1 ...
    ⬇ Installing attrs 19.3.0 ...
    Installation complete
    

    It should also install fonttools, see https://github.com/fonttools/ufoLib2/blob/master/setup.cfg. Not sure what's going on there.

    bug 
    opened by madig 15
  • Dependency to source only package cause error

    Dependency to source only package cause error

    When dependency is a source only distribution, I got error. Here is a procedure to reproduce it. pyflow 0.2.3 OS: Linux Mint 19.2

    ~/tmp$ pyflow new proj
    Please enter the Python version for this project: (eg: 3.8)
    3.8
    Created a new Python project named proj
    ~/tmp$ cd proj
    ~/tmp/proj (master #)$ RUST_BACKTRACE=full pyflow install ifaddr
    ⬇ Installing ifaddr 0.1.6 ...
    thread 'main' panicked at 'Problem running setup.py bdist_wheel: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:1165:5
    stack backtrace:
       0:     0x55d79b1daba4 - <unknown>
       1:     0x55d79b20342c - core::fmt::write::h01edf6dd68a42c9c
       2:     0x55d79b1d50c7 - <unknown>
       3:     0x55d79b1dd745 - <unknown>
       4:     0x55d79b1dd436 - <unknown>
       5:     0x55d79b1dde45 - std::panicking::rust_panic_with_hook::h825f041245da8739
       6:     0x55d79b1dd9e2 - <unknown>
       7:     0x55d79b1dd8d6 - rust_begin_unwind
       8:     0x55d79b1ffe9a - core::panicking::panic_fmt::h527855ce0bc891f6
       9:     0x55d79b1fff97 - core::result::unwrap_failed::ha8b77e6004f0ba38
      10:     0x55d79ae69812 - <unknown>
      11:     0x55d79ae422f1 - <unknown>
      12:     0x55d79ae4d248 - <unknown>
      13:     0x55d79ae7dd53 - <unknown>
      14:     0x55d79b1dd873 - <unknown>
      15:     0x55d79b1e7c3a - __rust_maybe_catch_panic
      16:     0x55d79b1de33d - std::rt::lang_start_internal::h409d4f2fe51133b0
      17:     0x55d79ae519c2 - <unknown>
      18:     0x7f5767267b97 - __libc_start_main
      19:     0x55d79ad76dc9 - <unknown>
      20:                0x0 - <unknown>
    ~/tmp/proj (master #)$ 
    
    bug 
    opened by miurahr 14
  • Fails to run on mac

    Fails to run on mac

    I installed with cargo from the master branch. When I run pyflow install numpy after entering a directory created with pyflow new projectname, I get (with RUST_BACTRACE=full):

    🐍Setting up Python environment...
    thread 'main' panicked at 'Problem creating lib directory: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:1165:5
    stack backtrace:
       0:        0x10d0ff995 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h458d13cb63d0c050
       1:        0x10d1259e0 - core::fmt::write::h53670af22ec3875f
       2:        0x10d0fa08b - std::io::Write::write_fmt::haf3d8737b9e851a5
       3:        0x10d101c8a - std::panicking::default_hook::{{closure}}::h3fbc052481cb023f
       4:        0x10d101995 - std::panicking::default_hook::h47b52fdc388b3b91
       5:        0x10d102357 - std::panicking::rust_panic_with_hook::he9c773346a268707
       6:        0x10d101ecd - std::panicking::continue_panic_fmt::h6ce88923515447fe
       7:        0x10d101e29 - rust_begin_unwind
       8:        0x10d13b59f - core::panicking::panic_fmt::h374d7a5fcdeaf2cf
       9:        0x10d13b679 - core::result::unwrap_failed::hdf38bf4ba53b175b
      10:        0x10cd74fb4 - pyflow::install::download_and_install_package::h962f28ab57bd4aee
      11:        0x10cd69612 - pyflow::py_versions::create_venv::hcb44ecfaa27a005d
      12:        0x10cd05525 - pyflow::util::find_venv_info::hb763c03c66689fc0
      13:        0x10cd45d58 - pyflow::main::hdf0794e46e104969
      14:        0x10cd29536 - std::rt::lang_start::{{closure}}::h26547f149e205262
      15:        0x10d101da8 - std::panicking::try::do_call::h1875c1f8f5700dda
      16:        0x10d10aaef - __rust_maybe_catch_panic
      17:        0x10d1027be - std::rt::lang_start_internal::h5206fcf99580d1b5
      18:        0x10cd4c699 - main
    
    
    bug 
    opened by alok 14
  • Installation on macos fails

    Installation on macos fails

    I'm hoping to use pyflow to distribute an app I'm developing, so I'm also using it to run the tests on TravisCI. However, the MacOS test is proving to be tricky, as the installation of pyflow via Rust fails with this error.:

    error[E0308]: mismatched types
       --> /Users/travis/.cargo/registry/src/github.com-1ecc6299db9ec823/pyflow-0.2.7/src/install.rs:405:29
        |
    405 |                 util::abort(error);
        |                             ^^^^^
        |                             |
        |                             expected `&str`, found struct `std::string::String`
        |                             help: consider borrowing here: `&error`
    error: aborting due to previous error
    For more information about this error, try `rustc --explain E0308`.
    error: failed to compile `pyflow v0.2.7`, intermediate artifacts can be found at `/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/cargo-installNfr0yT`
    
    

    Additionally, the mac binary linked in the readme only returns "not found" :(

    opened by MxFlix 11
  • Cannot `pyflow install black`

    Cannot `pyflow install black`

    Giving pyflow a spin for the first time and this came up:

    $ RUST_BACKTRACE=full pyflow install black
    Found lockfile
    ⬇ Installing appdirs 1.4.4 ...
    ⬇ Installing regex 2020.6.8 ...
    ⬇ Installing attrs 19.3.0 ...
    ⬇ Installing click 7.1.2 ...
    ⬇ Installing toml 0.10.1 ...
    ⬇ Installing black 19.10.0b0 ...
    EX PAR: "__pypackages__/3.8/lib/black-19.10b0" bin: "__pypackages__/3.8/.venv/bin"
    thread 'main' panicked at 'Problem running setup.py bdist_wheel: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:1165:5
    stack backtrace:
       0:     0x55da42d39e14 - backtrace::backtrace::libunwind::trace::h65597d255cb1398b
                                   at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/libunwind.rs:88
       1:     0x55da42d39e14 - backtrace::backtrace::trace_unsynchronized::hd4f479d7150ec4a0
                                   at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.40/src/backtrace/mod.rs:66
       2:     0x55da42d39e14 - std::sys_common::backtrace::_print_fmt::h015072984a2b172c
                                   at src/libstd/sys_common/backtrace.rs:77
       3:     0x55da42d39e14 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h6df05d3335f32194
                                   at src/libstd/sys_common/backtrace.rs:61
       4:     0x55da42d629bc - core::fmt::write::h1f444f4312eb6c27
                                   at src/libcore/fmt/mod.rs:1028
       5:     0x55da42d34387 - std::io::Write::write_fmt::h8d147888220078ef
                                   at src/libstd/io/mod.rs:1412
       6:     0x55da42d3c9be - std::sys_common::backtrace::_print::h8a6df0fa81d6af62
                                   at src/libstd/sys_common/backtrace.rs:65
       7:     0x55da42d3c9be - std::sys_common::backtrace::print::h6f05b4733407e509
                                   at src/libstd/sys_common/backtrace.rs:50
       8:     0x55da42d3c9be - std::panicking::default_hook::{{closure}}::h0d0a23bd02315dd8
                                   at src/libstd/panicking.rs:188
       9:     0x55da42d3c6b1 - std::panicking::default_hook::h8d15a9aecb4efac6
                                   at src/libstd/panicking.rs:205
      10:     0x55da42d3d0bb - std::panicking::rust_panic_with_hook::hbe174577402a475d
                                   at src/libstd/panicking.rs:464
      11:     0x55da42d3cc5e - std::panicking::continue_panic_fmt::h4d855dad868accf3
                                   at src/libstd/panicking.rs:373
      12:     0x55da42d3cb46 - rust_begin_unwind
                                   at src/libstd/panicking.rs:302
      13:     0x55da42d5f58e - core::panicking::panic_fmt::hdeb7979ab6591473
                                   at src/libcore/panicking.rs:139
      14:     0x55da42d5f687 - core::result::unwrap_failed::h054dd680e6fcd38b
                                   at src/libcore/result.rs:1165
      15:     0x55da429d0a2c - pyflow::install::download_and_install_package::h8e64a7e68ee71a6a
      16:     0x55da429ac1b5 - pyflow::sync::h2ff987914ed32726
      17:     0x55da429b6ced - pyflow::main::hfa569966dc82e778
      18:     0x55da428f4543 - std::rt::lang_start::{{closure}}::h29371ddbe7fb2bd0
      19:     0x55da42d3cae3 - std::rt::lang_start_internal::{{closure}}::h6ea535ec5c50fc3e
                                   at src/libstd/rt.rs:48
      20:     0x55da42d3cae3 - std::panicking::try::do_call::h631c6408dfccc6f5
                                   at src/libstd/panicking.rs:287
      21:     0x55da42d4715a - __rust_maybe_catch_panic
                                   at src/libpanic_unwind/lib.rs:78
      22:     0x55da42d3d59d - std::panicking::try::hab539b2d1255d635
                                   at src/libstd/panicking.rs:265
      23:     0x55da42d3d59d - std::panic::catch_unwind::hd5e0a26424bd7f34
                                   at src/libstd/panic.rs:396
      24:     0x55da42d3d59d - std::rt::lang_start_internal::h3bdc4c7d98181bf9
                                   at src/libstd/rt.rs:47
      25:     0x55da429bb492 - main
      26:     0x7f671ea21b97 - __libc_start_main
      27:     0x55da428e029a - _start
      28:                0x0 - <unknown>
    

    Installing other packages such as requests worked without a hitch.

    bug 
    opened by braincore 10
  • After failing to build a wheel, installing anything becomes impossible

    After failing to build a wheel, installing anything becomes impossible

    Doing this:

     pyflow install cheat
    Found lockfile
    Installing termcolor 1.1.0 ...
    Installing cheat 2.5.1 ...
    Problem building cheat from source. This may occur if a package that requires compiling has no wheels available for Windows, and the system is missing dependencies required to compile it, or if on WSL and installing to a mounted directory.
    

    If you try to install any other packages, it tries to reinstall cheat and fail every time:

    λ pyflow install tldr
    Installing cheat 2.5.1 ...
    Problem building cheat from source. This may occur if a package that requires compiling has no wheels available for Windows, and the system is missing dependencies required to compile it, or if on WSL and installing to a mounted directory.
    
    bug High priority 
    opened by ksamuel 10
  • `pyflow switch` does nothing

    `pyflow switch` does nothing

    1. git clone https://github.com/daltonmaag/statmake
    2. pyflow install
    3. pyflow -- should display some 3.6.x version
    4. pyflow switch 3.8 -- or something else you have lying around
    5. pyflow -- still displays 3.6.x :(
    bug 
    opened by madig 10
  • Suggestion: When current folder does not contain pyproject.toml, search parent directories

    Suggestion: When current folder does not contain pyproject.toml, search parent directories

    I suppose this is primarily an issue when you start to have nesting directories and cd around for some reason. Git and Poetry deal with this correctly. Feel free to close this if it is outside the scope for now or would introduce unwanted complexities about directory traversal.

    enhancement 
    opened by madig 10
  • Mac binary

    Mac binary

    There are currently no Mac binaries or installers available. There should be no reason this doesn't work on Mac, but it's untested, and requires building from source, or installing via Cargo for now.

    opened by David-OConnor 9
  • Error installing jupyterlab

    Error installing jupyterlab

    Trying to install JupyterLab and receiving the following error:

    thread 'main' panicked at 'Problem creating renamed path: AliasError { details: "Timed out attempting to create a directory" }', /Users/<username>/.cargo/registry/src/github.com-1ecc6299db9ec823/pyflow-0.2.9/src/main.rs:794:58 I got the same error in my both Mac and Manjaro machine.

    The way to reproduce:

    1. pyflow new test
    2. cd test
    3. pyenv local 3.8.2
    4. pyflow install jupyterlab

    I am able to install other packages.

    Strangely, once I encounter the above error, executing anypyflow install throws the following error: pyflow install humanize Can't find a compatible package for Req { name: "jupyter-server", constraints: [Constraint { type_: Exact, version: 1.5.1 }], extra: None, sys_platform: None, python_version: None, install_with_extras: None, path: None, git: None }

    The only option I have is to delete the folder and start again.

    The detailed log is as follows:

    thread 'main' panicked at 'Problem creating renamed path: AliasError { details: "Timed out attempting to create a directory" }', /home/<username>/.cargo/registry/src/github.com-1ecc6299db9ec823/pyflow-0.2.9/src/main.rs:794:58
    stack backtrace:
       0:     0x55b1a3476fc0 - std::backtrace_rs::backtrace::libunwind::trace::h38f496e2f60ff056
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/../../backtrace/src/backtrace/libunwind.rs:90:5
       1:     0x55b1a3476fc0 - std::backtrace_rs::backtrace::trace_unsynchronized::h56106da60d2adf4e
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
       2:     0x55b1a3476fc0 - std::sys_common::backtrace::_print_fmt::he96612ccef88d499
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:67:5
       3:     0x55b1a3476fc0 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h7bc9abcb54e035e8
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:46:22
       4:     0x55b1a349c6ec - core::fmt::write::hc902605fce7cd9d0
                                   at /build/rust/src/rustc-1.51.0-src/library/core/src/fmt/mod.rs:1096:17
       5:     0x55b1a346eea5 - std::io::Write::write_fmt::hc1b61b7b2ff05b80
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/io/mod.rs:1568:15
       6:     0x55b1a3479545 - std::sys_common::backtrace::_print::hbfdf09e2f4163e71
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:49:5
       7:     0x55b1a3479545 - std::sys_common::backtrace::print::h0f74697e38abc595
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:36:9
       8:     0x55b1a3479545 - std::panicking::default_hook::{{closure}}::hddc95caf81a22541
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:208:50
       9:     0x55b1a34790a3 - std::panicking::default_hook::h3eba1f2638a2c835
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:225:9
      10:     0x55b1a3479ce1 - std::panicking::rust_panic_with_hook::h8f88f1391abedf2a
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:591:17
      11:     0x55b1a3479827 - std::panicking::begin_panic_handler::{{closure}}::hf473b53e26f56dd7
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:497:13
      12:     0x55b1a347745c - std::sys_common::backtrace::__rust_end_short_backtrace::h6fde4603ccb02286
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/sys_common/backtrace.rs:141:18
      13:     0x55b1a3479789 - rust_begin_unwind
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:493:5
      14:     0x55b1a349b081 - core::panicking::panic_fmt::hac8c69602870cdf7
                                   at /build/rust/src/rustc-1.51.0-src/library/core/src/panicking.rs:92:14
      15:     0x55b1a349aea3 - core::option::expect_none_failed::h7dfb96068fc9393b
                                   at /build/rust/src/rustc-1.51.0-src/library/core/src/option.rs:1300:5
      16:     0x55b1a30fc1eb - pyflow::sync::h18ae6282611a06a1
      17:     0x55b1a3105950 - pyflow::main::ha4fd5b6d8d9d500c
      18:     0x55b1a3109d53 - std::sys_common::backtrace::__rust_begin_short_backtrace::hbfe38066b3db6f54
      19:     0x55b1a3120439 - std::rt::lang_start::{{closure}}::h344b9e40964d9259
      20:     0x55b1a347a107 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h6646ba386ff34dbe
                                   at /build/rust/src/rustc-1.51.0-src/library/core/src/ops/function.rs:259:13
      21:     0x55b1a347a107 - std::panicking::try::do_call::h47e376e14a330979
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:379:40
      22:     0x55b1a347a107 - std::panicking::try::hb7ef6d6b3d4db346
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panicking.rs:343:19
      23:     0x55b1a347a107 - std::panic::catch_unwind::h534d7ac891813066
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/panic.rs:431:14
      24:     0x55b1a347a107 - std::rt::lang_start_internal::h8191eeb0dbee8736
                                   at /build/rust/src/rustc-1.51.0-src/library/std/src/rt.rs:51:25
      25:     0x55b1a3109d22 - main
      26:     0x7fe838880b25 - __libc_start_main
      27:     0x55b1a305d0ae - _start
      28:                0x0 - <unknown>
    
    bug 
    opened by vishrawas 5
  • Windows 10 was misrecognized as

    Windows 10 was misrecognized as "manylinux2014_aarch64" in Powershell

    • OS: Windows 10 Professional
    • Shell: Powershell 5.1, Powershell Core 7.0.3
    • Python: not installed
    • pyflow: 0.2.7 (installed in scoop)
    • pyflow --version: pyflow 0.2.6
    • scoop list pyflow: pyflow 0.2.7
    pyproject.toml:
    # See PEP 518: https://www.python.org/dev/peps/pep-0518/ for info on this file's structure.
    
    [tool.pyflow]
    name = ""
    py_version = "3.8"
    version = "0.5.0"
    
    # [tool.pyflow.scripts]
    
    [tool.pyflow.dependencies]
    ahk = "0.9.0"
    numpy = "1.19.1"
    openpyxl = "3.0.5"
    pandas = "1.1.1"
    requests = "2.24.0"
    roman = "3.3.0"
    
    [tool.pyflow.dev-dependencies]
    pytest = "6.0.1"
    
    • Commands (after pyflow clear; pyflow reset):
    $env:RUST_BACKTRACE="full"
    pyflow
    
    • Error message:
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    

    and

    thread 'main' panicked at 'Problem parsing constraint from requires_python: DependencyError { details: "Problem parsing version: " }', src\util.rs:671:38
    
    Outputs (Powershell 5.1):
    Downloading Python 3.8.0...
    Installing Python 3.8.0...
    Setting up Python...
    Installing chardet 3.0.4 ...
    Added a console script: chardetect
    Installing jdcal 1.4.1 ...
    Installing pytest 6.0.1 ...
    Added a console script: py.test
    Added a console script: pytest
    Installing atomicwrites 1.4.0 ...
    Installing py 1.9.0 ...
    Installing pandas 1.1.1 ...
    Installing toml 0.10.1 ...
    Installing pluggy 0.13.1 ...
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    Outputs (Powershell 7.0.3):
    Downloading Python 3.8.0...
    Installing Python 3.8.0...
    Setting up Python...
    Installing toml 0.10.1 ...
    Installing packaging 20.4.0 ...
    Installing six 1.15.0 ...
    Installing pyparsing 2.4.7 ...
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    After run `pyflow` over and over against the project:
    Installing pytz 2020.1.0 ...
    Installing jdcal 1.4.1 ...
    Installing pandas 1.1.1 ...
    Installing et_xmlfile 1.0.1 ...
    Installing jinja2 2.11.2 ...
    Installing colorama 0.4.3 ...
    Installing atomicwrites 1.4.0 ...
    Installing python_dateutil 2.8.1 ...
    Installing markupsafe 1.1.1 ...
    Installing idna 2.10.0 ...
    Installing pluggy 0.13.1 ...
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    Installing more_itertools 8.4.0 ...
    Installing py 1.9.0 ...
    Installing certifi 2020.6.20 ...
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    Installing urllib3 1.25.10 ...
    thread 'main' panicked at 'Problem parsing constraint from requires_python: DependencyError { details: "Problem parsing version: " }', src\util.rs:671:38
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff62666d810 - <unknown>
       8:     0x7ff62666d643 - <unknown>
       9:     0x7ff626249b42 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    Installing roman 3.3.0 ...
    Added a console script: roman
    Installing attrs 20.1.0 ...
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    thread 'main' panicked at 'Problem parsing constraint from requires_python: DependencyError { details: "Problem parsing version: " }', src\util.rs:671:38
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff62666d810 - <unknown>
       8:     0x7ff62666d643 - <unknown>
       9:     0x7ff626249b42 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    Installing chardet 3.0.4 ...
    Added a console script: chardetect
    thread 'main' panicked at 'Problem parsing constraint from requires_python: DependencyError { details: "Problem parsing version: " }', src\util.rs:671:38
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff62666d810 - <unknown>
       8:     0x7ff62666d643 - <unknown>
       9:     0x7ff626249b42 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    thread 'main' panicked at 'Problem parsing constraint from requires_python: DependencyError { details: "Problem parsing version: " }', src\util.rs:671:38
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff62666d810 - <unknown>
       8:     0x7ff62666d643 - <unknown>
       9:     0x7ff626249b42 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    thread 'main' panicked at 'Problem parsing Os: manylinux2014_aarch64', src\util.rs:643:53
    stack backtrace:
       0:     0x7ff62664e69f - <unknown>
       1:     0x7ff62666eecb - <unknown>
       2:     0x7ff626644a3c - <unknown>
       3:     0x7ff626651aac - <unknown>
       4:     0x7ff6266516ef - <unknown>
       5:     0x7ff626652297 - <unknown>
       6:     0x7ff626651e1f - <unknown>
       7:     0x7ff626651d8c - <unknown>
       8:     0x7ff6262490d0 - <unknown>
       9:     0x7ff626249a65 - <unknown>
      10:     0x7ff626284872 - <unknown>
      11:     0x7ff62628ed72 - <unknown>
      12:     0x7ff626252676 - <unknown>
      13:     0x7ff6266524bf - <unknown>
      14:     0x7ff62629edb7 - <unknown>
      15:     0x7ff626692624 - <unknown>
      16:     0x7ff9ce036fd4 - BaseThreadInitThunk
      17:     0x7ff9ce21cec1 - RtlUserThreadStart
    
    bug 
    opened by luckynum7 5
  • `Aborting graph creation: Problem getting dependency data` issue

    `Aborting graph creation: Problem getting dependency data` issue

    Trying to regression testing pyflow, but ran into some Aborting graph creation: Problem getting dependency data failure.

    How to reproduce

    • brew install pyflow
    • virtualenv setup with python 3.9.14
    • pyflow init
    • pyflow install boto3

    Error log as below

    test error
    $ virtualenv . -p python3.9 && source bin/activate
    created virtual environment CPython3.9.14.final.0-64 in 585ms
      creator CPython3Posix(dest=/Users/rui/Downloads/brew, clear=False, no_vcs_ignore=False, global=False)
      seeder FromAppData(download=False, pip=bundle, wheel=bundle, setuptools=bundle, via=copy, app_data_dir=/Users/rui/Library/Application Support/virtualenv)
        added seed packages: pip==22.3, setuptools==65.5.0, wheel==0.37.1
      activators NushellActivator,PythonActivator,FishActivator,CShellActivator,PowerShellActivator,BashActivator
    (brew)
    
    $ pyflow init
    Please enter the Python version for this project: (eg: 3.8)
    Default [3.9.14]:
    Created `pyproject.toml`
    Found multiple compatible Python versions. Please enter the number associated with the one you'd like to use:
    1: python3.9: 3.9.14
    2: python3: 3.9.14
    3: python: 3.9.14
    1
    🐍 Setting up Python...
    (brew)
    
    $ pyflow install boto3
    Found lockfile
    Aborting graph creation: Problem getting dependency data
     Reqs: [
        Req {
            name: "boto3",
            constraints: [
                Constraint {
                    type_: Caret,
                    version: 1.26.17,
                },
            ],
            extra: None,
            sys_platform: None,
            python_version: None,
            install_with_extras: None,
            path: None,
            git: None,
        },
    ]
                 It's taking a long time to get dependency data - this usually suggests that the dependency tree is being newly built. Please try again in a few minutes, and if the error still occurs, consider opening an issue on github.
    
    opened by chenrui333 2
  • Maybe use indygreg/python-build-standalone for Python binaries?

    Maybe use indygreg/python-build-standalone for Python binaries?

    https://github.com/indygreg/python-build-standalone/releases (The maintainer uses this to support his PyOxidizer project, another Rust project helping the Python world.)

    Covers MacOS, Linux, and Windows builds and is usually updated within a couple of weeks of a new Python release. Could be a suitable replacement for https://github.com/David-OConnor/pybin/releases. (No offense.)

    Pyflow has some nice ideas. Maybe using another project to help with some of the heavy lifting would breathe some more life into it and would potentially solve some outstanding issues like #136 .

    opened by emcd 0
  • Installing ujson panics

    Installing ujson panics

    When trying to install the ujson library from pypi, pyflow panics.

    ⬇ Installing ujson 5.5.0 ...
    thread 'main' panicked at 'running setup.py bdist_wheel in folder "/home/jfk/code/tic/__pypackages__/3.10/lib/ujson-5.5.0". Py path: "/home/jfk/code/tic/__pypackages__/3.10/.venv/bin/python": /usr/lib/python3.10/site-packages/setuptools/installer.py:27: SetuptoolsDeprecationWarning: setuptools.installer is deprecated. Requirements should be satisfied by a PEP 517 installer.
      warnings.warn(
    /usr/bin/python3: No module named pip
    Traceback (most recent call last):
      File "/usr/lib/python3.10/site-packages/setuptools/installer.py", line 82, in fetch_build_egg
        subprocess.check_call(cmd)
      File "/usr/lib/python3.10/subprocess.py", line 369, in check_call
        raise CalledProcessError(retcode, cmd)
    subprocess.CalledProcessError: Command '['/usr/bin/python3', '-m', 'pip', '--disable-pip-version-check', 'wheel', '--no-deps', '-w', '/tmp/tmpwmd_1pqn', '--quiet', 'setuptools-scm']' returned non-zero exit status 1.
    
    The above exception was the direct cause of the following exception:
    Traceback (most recent call last):
      File "/home/jfk/code/tic/__pypackages__/3.10/lib/ujson-5.5.0/setup.py", line 55, in <module>
        setup(
      File "/usr/lib/python3.10/site-packages/setuptools/__init__.py", line 86, in setup
        _install_setup_requires(attrs)
      File "/usr/lib/python3.10/site-packages/setuptools/__init__.py", line 80, in _install_setup_requires
        dist.fetch_build_eggs(dist.setup_requires)
      File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 875, in fetch_build_eggs
        resolved_dists = pkg_resources.working_set.resolve(
      File "/usr/lib/python3.10/site-packages/pkg_resources/__init__.py", line 789, in resolve
        dist = best[req.key] = env.best_match(
      File "/usr/lib/python3.10/site-packages/pkg_resources/__init__.py", line 1075, in best_match
        return self.obtain(req, installer)
      File "/usr/lib/python3.10/site-packages/pkg_resources/__init__.py", line 1087, in obtain
        return installer(requirement)
      File "/usr/lib/python3.10/site-packages/setuptools/dist.py", line 945, in fetch_build_egg
        return fetch_build_egg(self, req)
      File "/usr/lib/python3.10/site-packages/setuptools/installer.py", line 84, in fetch_build_egg
        raise DistutilsError(str(e)) from e
    distutils.errors.DistutilsError: Command '['/usr/bin/python3', '-m', 'pip', '--disable-pip-version-check', 'wheel', '--no-deps', '-w', '/tmp/tmpwmd_1pqn', '--quiet', 'setuptools-scm']' returned non-zero exit status 1.
    ', src/install.rs:391:21
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    opened by knolljo 0
  • "Can't get version info"

    Trying pyflow for the first time, I'm getting this right away on our ubuntu.com project (trying pyflow install or pyflow switch or just pyflow bare):

    $ pyflow switch 3.10
    Switched to Python version 3.10
    Found multiple compatible Python versions. Please enter the number associated with the one you'd like to use:
    1: python3.10: 3.10.6
    2: python3: 3.10.6
    1
    🐍 Setting up Python...
    Can't get version info for the dependency `canonicalwebteam`. Is it spelled correctly? Is the internet connection ok?
    

    I can't quite tell where this error is coming from. But I (we) wrote the canonicalwebteam set of packages. They install and work fine with pip, but I can well believe we've done something unconventional in the setup. Could you give me a pointer as to how to get past this?

    opened by nottrobin 0
  • Can't find a compatible package for Req

    Can't find a compatible package for Req

    Reproduce the bug

    a pyproject.toml with only one dependency:

    [tool.pyflow.dependencies]
    ccxt = "1.72.98"
    
    

    run:

    $ pyflow install
    opts Opt { subcmds: Install { packages: [], dev: false }, color: None }
    Can't find a compatible package for Req { name: "yarl", constraints: [Constraint { type_: Exact, version: 1.7.2 }], extra: None, sys_platform: None, python_version: Some([Constraint { type_: Gte, version: 3.5.2 }]), install_with_extras: None, path: None, git: None }
    

    If I use other packager manager like pdm, the dependency can be solved without problem.

    opened by dev590t 0
  • stop using system Python to build wheels

    stop using system Python to build wheels

    On Linux and Mac, pyflow intentionally runs python3 from PATH to build wheels, rather than using the copy of Python selected for the project:

    // The Linux and Mac builds appear to be unable to build wheels due to
    // missing the ctypes library; revert to system python.
    

    This broke for me because of #177: the copy of Python I had installed as python3 didn't have wheel installed.

    Even if that weren't an issue, it also happens to be a different version of Python from the one I selected for this project, so if I was building any packages that included C extensions, the wheels it built wouldn't work with the latter.

    In general, using the system Python his seems like a workaround, but it should be replaced with a proper fix for whatever issue there is with ctypes.

    opened by comex 0
Releases(0.3.1)
Owner
David O'Connor
David O'Connor
Example for how to package a Python library based on Cython.

Cython sample module This project is an example of a module that can be built using Cython. It is an upgrade from a similar model developed by Arin Kh

Juan José García Ripoll 4 Aug 28, 2022
Dotpkg - Package manager for your dotfiles

Dotpkg A package manager for your dotfiles. Usage First make sure to have Python

FW 4 Mar 18, 2022
local pypi server (custom packages and auto-mirroring of pypi)

localshop A PyPI server which automatically proxies and mirrors PyPI packages based upon packages requested. It has support for multiple indexes and t

Michael van Tellingen 383 Sep 23, 2022
A PyPI mirror client according to PEP 381 http://www.python.org/dev/peps/pep-0381/

This is a PyPI mirror client according to PEP 381 + PEP 503 http://www.python.org/dev/peps/pep-0381/. bandersnatch =4.0 supports Linux, MacOSX + Wind

Python Packaging Authority 345 Dec 28, 2022
A PDM plugin that packs your packages into a zipapp

pdm-packer A PDM plugin that packs your packages into a zipapp Requirements pdm-packer requires Python =3.7 Installation If you have installed PDM wi

Frost Ming 23 Dec 29, 2022
Python PyPi staging server and packaging, testing, release tool

devpi: PyPI server and packaging/testing/release tool This repository contains three packages comprising the core devpi system on the server and clien

629 Jan 01, 2023
Simple Library Management made with Python

Installation pip install mysql-connector-python NOTE: You must make a database (library) & and table (books, student) to hold all data. Languange and

SonLyte 10 Oct 21, 2021
Cilantropy: a Python Package Manager interface created to provide an "easy-to-use" visual and also a command-line interface for Pythonistas.

Cilantropy Cilantropy is a Python Package Manager interface created to provide an "easy-to-use" visual and also a command-line interface for Pythonist

48 Dec 16, 2022
[DEPRECATED] YUM package manager

⛔ This project is deprecated. Please use DNF, the successor of YUM. YUM Yum is an automatic updater and installer for rpm-based systems. Included prog

111 Dec 20, 2022
A tool to upgrade dependencies to the latest versions

pip-check-updates A tool to upgrade dependencies to the latest versions, inspired by npm-check-updates Install From PyPi pip install pip-check-updates

Zeheng Li 12 Jan 06, 2023
An installation and dependency system for Python

Pyflow Simple is better than complex - The Zen of Python Pyflow streamlines working with Python projects and files. It's an easy-to-use CLI app with a

David O'Connor 1.2k Dec 23, 2022
OS-agnostic, system-level binary package manager and ecosystem

Conda is a cross-platform, language-agnostic binary package manager. It is the package manager used by Anaconda installations, but it may be used for

Conda 5.1k Dec 30, 2022
Python dependency management and packaging made easy.

Poetry: Dependency Management for Python Poetry helps you declare, manage and install dependencies of Python projects, ensuring you have the right sta

Poetry 23.1k Jan 01, 2023
Install and Run Python Applications in Isolated Environments

pipx — Install and Run Python Applications in Isolated Environments Documentation: https://pipxproject.github.io/pipx/ Source Code: https://github.com

5.8k Dec 31, 2022
OS-agnostic, system-level binary package manager and ecosystem

Conda is a cross-platform, language-agnostic binary package manager. It is the package manager used by Anaconda installations, but it may be used for

Conda 5.1k Jan 07, 2023
A Poetry plugin for dynamically extracting the package version.

Poetry Version Plugin A Poetry plugin for dynamically extracting the package version. It can read the version from a file __init__.py with: # __init__

Sebastián Ramírez 264 Dec 22, 2022
pipreqs - Generate pip requirements.txt file based on imports of any project. Looking for maintainers to move this project forward.

pipreqs - Generate requirements.txt file for any project based on imports Installation pip install pipreqs Usage Usage: pipreqs [options] path

Vadim Kravcenko 4.8k Dec 31, 2022
Easy to use, fast, git sourced based, C/C++ package manager.

Yet Another C/C++ Package Manager Easy to use, fast, git sourced based, C/C++ package manager. Features No need to install a program, just include the

31 Dec 21, 2022
PokerFace is a Python package for various poker tools.

PokerFace is a Python package for various poker tools. The following features are present in PokerFace... Types for cards and their componen

Juho Kim 21 Dec 29, 2022
The delightful package manager for AppImages

⚡️ Zap The delightful package manager for AppImages Report bug · Request feature Looking for the older Zap v1 (Python) implementation? Head over to v1

Srevin Saju 368 Jan 04, 2023