# Javascript Function Max

| | | |

#### Contents

The Python max () function is used to find the largest value in a list of values. The Python min () function is used to find the lowest value in a list. The list of values ‚Äã‚Äãcan contain strings or numbers.

You may come across a situation where you want to find the minimum or maximum value in a list or string. For example, you could write a program that finds the most expensive car sold at your dealership. This is where Python’s built-in min () and max () functions come in.

In Python, you can use min () and max () to find the smallest and largest value in a list or string, respectively. This guide will explore how to use the min () and max () methods in Python and walk you through a few examples of each.

## Python min ()

The Python min () function returns the lowest value in a list of items. min () can be used to find the smallest number in a list or the first string that would appear in the list if the list were sorted alphabetically.

Here is the syntax for Python min () method:

In this syntax, the min () method accepts only one parameter: the object for which we want to find the minimum value.

You can also specify individual values ‚Äã‚Äãas arguments with the min value () function:

The largest of all the values ‚Äã‚Äãwe specify as arguments is returned if you choose to specify individual values.

You can pass an iterable like a list or a list tuple as an argument to the min ( ). If an iterable is empty, a ValueError is raised like this:

ValueError: max () arg is an empty sequence

Read our article on "ValueError: max () arg is an empty sequence‚Äù (which also applies to the min () method) for more information.

### min Python example

Here is a simple example of using the min () to find the lowest value in a list:

Our code returns: 14.

In the first line of our code, we define a list called example_list which stores four values. Next line, we use min () to find the smallest value in this list and display it to the console.

Let’s use a more detailed example to show this method in action. Let’s say we own a cafe and have created a list of potential milk vendors. We found six suppliers and created a table that stores the price per gallon that each supplier gave us.

We want to find the cheapest supplier on our list, we can do that using the following program:

Our code returns the smallest element of our iterable:

In the first line of our code, we define a list of supplier quotes. Next, we use the min () method to find the smallest value and print a message with the result of that method. In this case, the lowest price available was \$ 3.26 per gallon of milk.

## Python Max function

The Python max () function returns the largest value in an iterable, such as a list. If a list contains strings, the last item in alphabetical order is returned by max ().

Let’s take a look at the Python syntax of the max () function:

You can specify individual values ‚Äã‚Äãwith the highest value selected.

We can also use this syntax where we pass an iterable as an argument:

The second example is the most common use of max (). This code reads the contents of the specified iterable, as a list, and returns the largest value in that iterable.

Passing an empty value as an argument to the max () function will have the same ValueError result discussed above.

### max () Python example

Let’s say we are premium coffee and try to pay a higher price for quality milk. We were able to find the biggest quote we received using the following code:

Our code returns the largest item in our list:

As you can see, our code is almost identical to the code in the min () example above. Instead of using min (), we used max ().

The max () method looked up in our

## Python Min and Max with strings

In the examples above, we used min () and max () to find the smallest and largest values ‚Äã‚Äãin a list.

The min () and max () can also be used to search for smallest and larger characters in a string. In this case , smaller and larger refer to the position of the character in the alphabet.

Let’s say we have a string containing the grades for each student in a fifth grade math class. We want to know which was the lowest score. To calculate the lowest score, we could use the max () function. Here is an example of a program that does this:

Our code returns:

Our code searches a Python string to find the smallest value. In this case, the lowest score was D, which our max () function identified and returned to our code.

When using strings and the min () and max () methods, you can specify multiple parameters. to find the smallest and largest string of multiple values.

Suppose you have three student names and you want to know which one comes last in alphabetical order. You can do this using the following code:

Our code returns:

The max ( ) took three parameters: name_name, name_name and name_name. The max () method then calculated which of these names comes last in alphabetical order and returned that name to the program.

Finally, our code printed a message that indicated the name that appears at the end of the alphabet.

## Conclusion

Often times when working with lists or strings you will want to find the lowest or highest value that appears in that list or string. The Python min () and max () methods can be used to do this.

This tutorial explains how to use the min () and max () with Python lists and strings. You are now ready to start working with min () and max () on lists and strings like a pro!

## How do I merge two dictionaries in a single expression (taking union of dictionaries)?

### Question by Carl Meyer

I have two Python dictionaries, and I want to write a single expression that returns these two dictionaries, merged (i.e. taking the union). The `update()` method would be what I need, if it returned its result instead of modifying a dictionary in-place.

``````>>> x = {"a": 1, "b": 2}
>>> y = {"b": 10, "c": 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{"a": 1, "b": 10, "c": 11}
``````

How can I get that final merged dictionary in `z`, not `x`?

(To be extra-clear, the last-one-wins conflict-handling of `dict.update()` is what I"m looking for as well.)

## How can I merge two Python dictionaries in a single expression?

For dictionaries `x` and `y`, `z` becomes a shallowly-merged dictionary with values from `y` replacing those from `x`.

• In Python 3.9.0 or greater (released 17 October 2020): PEP-584, discussed here, was implemented and provides the simplest method:

``````z = x | y          # NOTE: 3.9+ ONLY
``````
• In Python 3.5 or greater:

``````z = {**x, **y}
``````
• In Python 2, (or 3.4 or lower) write a function:

``````def merge_two_dicts(x, y):
z.update(y)    # modifies z with keys and values of y
return z
``````

and now:

``````z = merge_two_dicts(x, y)
``````

### Explanation

Say you have two dictionaries and you want to merge them into a new dictionary without altering the original dictionaries:

``````x = {"a": 1, "b": 2}
y = {"b": 3, "c": 4}
``````

The desired result is to get a new dictionary (`z`) with the values merged, and the second dictionary"s values overwriting those from the first.

``````>>> z
{"a": 1, "b": 3, "c": 4}
``````

A new syntax for this, proposed in PEP 448 and available as of Python 3.5, is

``````z = {**x, **y}
``````

And it is indeed a single expression.

Note that we can merge in with literal notation as well:

``````z = {**x, "foo": 1, "bar": 2, **y}
``````

and now:

``````>>> z
{"a": 1, "b": 3, "foo": 1, "bar": 2, "c": 4}
``````

It is now showing as implemented in the release schedule for 3.5, PEP 478, and it has now made its way into the What"s New in Python 3.5 document.

However, since many organizations are still on Python 2, you may wish to do this in a backward-compatible way. The classically Pythonic way, available in Python 2 and Python 3.0-3.4, is to do this as a two-step process:

``````z = x.copy()
z.update(y) # which returns None since it mutates z
``````

In both approaches, `y` will come second and its values will replace `x`"s values, thus `b` will point to `3` in our final result.

## Not yet on Python 3.5, but want a single expression

If you are not yet on Python 3.5 or need to write backward-compatible code, and you want this in a single expression, the most performant while the correct approach is to put it in a function:

``````def merge_two_dicts(x, y):
"""Given two dictionaries, merge them into a new dict as a shallow copy."""
z = x.copy()
z.update(y)
return z
``````

and then you have a single expression:

``````z = merge_two_dicts(x, y)
``````

You can also make a function to merge an arbitrary number of dictionaries, from zero to a very large number:

``````def merge_dicts(*dict_args):
"""
Given any number of dictionaries, shallow copy and merge into a new dict,
precedence goes to key-value pairs in latter dictionaries.
"""
result = {}
for dictionary in dict_args:
result.update(dictionary)
return result
``````

This function will work in Python 2 and 3 for all dictionaries. e.g. given dictionaries `a` to `g`:

``````z = merge_dicts(a, b, c, d, e, f, g)
``````

and key-value pairs in `g` will take precedence over dictionaries `a` to `f`, and so on.

Don"t use what you see in the formerly accepted answer:

``````z = dict(x.items() + y.items())
``````

In Python 2, you create two lists in memory for each dict, create a third list in memory with length equal to the length of the first two put together, and then discard all three lists to create the dict. In Python 3, this will fail because you"re adding two `dict_items` objects together, not two lists -

``````>>> c = dict(a.items() + b.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: "dict_items" and "dict_items"
``````

and you would have to explicitly create them as lists, e.g. `z = dict(list(x.items()) + list(y.items()))`. This is a waste of resources and computation power.

Similarly, taking the union of `items()` in Python 3 (`viewitems()` in Python 2.7) will also fail when values are unhashable objects (like lists, for example). Even if your values are hashable, since sets are semantically unordered, the behavior is undefined in regards to precedence. So don"t do this:

``````>>> c = dict(a.items() | b.items())
``````

This example demonstrates what happens when values are unhashable:

``````>>> x = {"a": []}
>>> y = {"b": []}
>>> dict(x.items() | y.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: "list"
``````

Here"s an example where `y` should have precedence, but instead the value from `x` is retained due to the arbitrary order of sets:

``````>>> x = {"a": 2}
>>> y = {"a": 1}
>>> dict(x.items() | y.items())
{"a": 2}
``````

Another hack you should not use:

``````z = dict(x, **y)
``````

This uses the `dict` constructor and is very fast and memory-efficient (even slightly more so than our two-step process) but unless you know precisely what is happening here (that is, the second dict is being passed as keyword arguments to the dict constructor), it"s difficult to read, it"s not the intended usage, and so it is not Pythonic.

Here"s an example of the usage being remediated in django.

Dictionaries are intended to take hashable keys (e.g. `frozenset`s or tuples), but this method fails in Python 3 when keys are not strings.

``````>>> c = dict(a, **b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: keyword arguments must be strings
``````

From the mailing list, Guido van Rossum, the creator of the language, wrote:

I am fine with declaring dict({}, **{1:3}) illegal, since after all it is abuse of the ** mechanism.

and

Apparently dict(x, **y) is going around as "cool hack" for "call x.update(y) and return x". Personally, I find it more despicable than cool.

It is my understanding (as well as the understanding of the creator of the language) that the intended usage for `dict(**y)` is for creating dictionaries for readability purposes, e.g.:

``````dict(a=1, b=10, c=11)
``````

``````{"a": 1, "b": 10, "c": 11}
``````

Despite what Guido says, `dict(x, **y)` is in line with the dict specification, which btw. works for both Python 2 and 3. The fact that this only works for string keys is a direct consequence of how keyword parameters work and not a short-coming of dict. Nor is using the ** operator in this place an abuse of the mechanism, in fact, ** was designed precisely to pass dictionaries as keywords.

Again, it doesn"t work for 3 when keys are not strings. The implicit calling contract is that namespaces take ordinary dictionaries, while users must only pass keyword arguments that are strings. All other callables enforced it. `dict` broke this consistency in Python 2:

``````>>> foo(**{("a", "b"): None})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() keywords must be strings
>>> dict(**{("a", "b"): None})
{("a", "b"): None}
``````

This inconsistency was bad given other implementations of Python (PyPy, Jython, IronPython). Thus it was fixed in Python 3, as this usage could be a breaking change.

I submit to you that it is malicious incompetence to intentionally write code that only works in one version of a language or that only works given certain arbitrary constraints.

`dict(x.items() + y.items())` is still the most readable solution for Python 2. Readability counts.

My response: `merge_two_dicts(x, y)` actually seems much clearer to me, if we"re actually concerned about readability. And it is not forward compatible, as Python 2 is increasingly deprecated.

`{**x, **y}` does not seem to handle nested dictionaries. the contents of nested keys are simply overwritten, not merged [...] I ended up being burnt by these answers that do not merge recursively and I was surprised no one mentioned it. In my interpretation of the word "merging" these answers describe "updating one dict with another", and not merging.

Yes. I must refer you back to the question, which is asking for a shallow merge of two dictionaries, with the first"s values being overwritten by the second"s - in a single expression.

Assuming two dictionaries of dictionaries, one might recursively merge them in a single function, but you should be careful not to modify the dictionaries from either source, and the surest way to avoid that is to make a copy when assigning values. As keys must be hashable and are usually therefore immutable, it is pointless to copy them:

``````from copy import deepcopy

def dict_of_dicts_merge(x, y):
z = {}
overlapping_keys = x.keys() & y.keys()
for key in overlapping_keys:
z[key] = dict_of_dicts_merge(x[key], y[key])
for key in x.keys() - overlapping_keys:
z[key] = deepcopy(x[key])
for key in y.keys() - overlapping_keys:
z[key] = deepcopy(y[key])
return z
``````

Usage:

``````>>> x = {"a":{1:{}}, "b": {2:{}}}
>>> y = {"b":{10:{}}, "c": {11:{}}}
>>> dict_of_dicts_merge(x, y)
{"b": {2: {}, 10: {}}, "a": {1: {}}, "c": {11: {}}}
``````

Coming up with contingencies for other value types is far beyond the scope of this question, so I will point you at my answer to the canonical question on a "Dictionaries of dictionaries merge".

## Less Performant But Correct Ad-hocs

These approaches are less performant, but they will provide correct behavior. They will be much less performant than `copy` and `update` or the new unpacking because they iterate through each key-value pair at a higher level of abstraction, but they do respect the order of precedence (latter dictionaries have precedence)

You can also chain the dictionaries manually inside a dict comprehension:

``````{k: v for d in dicts for k, v in d.items()} # iteritems in Python 2.7
``````

or in Python 2.6 (and perhaps as early as 2.4 when generator expressions were introduced):

``````dict((k, v) for d in dicts for k, v in d.items()) # iteritems in Python 2
``````

`itertools.chain` will chain the iterators over the key-value pairs in the correct order:

``````from itertools import chain
z = dict(chain(x.items(), y.items())) # iteritems in Python 2
``````

## Performance Analysis

I"m only going to do the performance analysis of the usages known to behave correctly. (Self-contained so you can copy and paste yourself.)

``````from timeit import repeat
from itertools import chain

x = dict.fromkeys("abcdefg")
y = dict.fromkeys("efghijk")

def merge_two_dicts(x, y):
z = x.copy()
z.update(y)
return z

min(repeat(lambda: {**x, **y}))
min(repeat(lambda: merge_two_dicts(x, y)))
min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()}))
min(repeat(lambda: dict(chain(x.items(), y.items()))))
min(repeat(lambda: dict(item for d in (x, y) for item in d.items())))
``````

In Python 3.8.1, NixOS:

``````>>> min(repeat(lambda: {**x, **y}))
1.0804965235292912
>>> min(repeat(lambda: merge_two_dicts(x, y)))
1.636518670246005
>>> min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()}))
3.1779992282390594
>>> min(repeat(lambda: dict(chain(x.items(), y.items()))))
2.740647904574871
>>> min(repeat(lambda: dict(item for d in (x, y) for item in d.items())))
4.266070580109954
``````
``````\$ uname -a
Linux nixos 4.19.113 #1-NixOS SMP Wed Mar 25 07:06:15 UTC 2020 x86_64 GNU/Linux
``````

## Resources on Dictionaries

In your case, what you can do is:

``````z = dict(list(x.items()) + list(y.items()))
``````

This will, as you want it, put the final dict in `z`, and make the value for key `b` be properly overridden by the second (`y`) dict"s value:

``````>>> x = {"a":1, "b": 2}
>>> y = {"b":10, "c": 11}
>>> z = dict(list(x.items()) + list(y.items()))
>>> z
{"a": 1, "c": 11, "b": 10}

``````

If you use Python 2, you can even remove the `list()` calls. To create z:

``````>>> z = dict(x.items() + y.items())
>>> z
{"a": 1, "c": 11, "b": 10}
``````

If you use Python version 3.9.0a4 or greater, then you can directly use:

``````x = {"a":1, "b": 2}
y = {"b":10, "c": 11}
z = x | y
print(z)
``````
``````{"a": 1, "c": 11, "b": 10}
``````

An alternative:

``````z = x.copy()
z.update(y)
``````

Another, more concise, option:

``````z = dict(x, **y)
``````

Note: this has become a popular answer, but it is important to point out that if `y` has any non-string keys, the fact that this works at all is an abuse of a CPython implementation detail, and it does not work in Python 3, or in PyPy, IronPython, or Jython. Also, Guido is not a fan. So I can"t recommend this technique for forward-compatible or cross-implementation portable code, which really means it should be avoided entirely.

This probably won"t be a popular answer, but you almost certainly do not want to do this. If you want a copy that"s a merge, then use copy (or deepcopy, depending on what you want) and then update. The two lines of code are much more readable - more Pythonic - than the single line creation with .items() + .items(). Explicit is better than implicit.

In addition, when you use .items() (pre Python 3.0), you"re creating a new list that contains the items from the dict. If your dictionaries are large, then that is quite a lot of overhead (two large lists that will be thrown away as soon as the merged dict is created). update() can work more efficiently, because it can run through the second dict item-by-item.

In terms of time:

``````>>> timeit.Timer("dict(x, **y)", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
15.52571702003479
>>> timeit.Timer("temp = x.copy()
temp.update(y)", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
15.694622993469238
>>> timeit.Timer("dict(x.items() + y.items())", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
41.484580039978027
``````

IMO the tiny slowdown between the first two is worth it for the readability. In addition, keyword arguments for dictionary creation was only added in Python 2.3, whereas copy() and update() will work in older versions.

## Finding the index of an item in a list

Given a list `["foo", "bar", "baz"]` and an item in the list `"bar"`, how do I get its index (`1`) in Python?

``````>>> ["foo", "bar", "baz"].index("bar")
1
``````

Reference: Data Structures > More on Lists

# Caveats follow

Note that while this is perhaps the cleanest way to answer the question as asked, `index` is a rather weak component of the `list` API, and I can"t remember the last time I used it in anger. It"s been pointed out to me in the comments that because this answer is heavily referenced, it should be made more complete. Some caveats about `list.index` follow. It is probably worth initially taking a look at the documentation for it:

``````list.index(x[, start[, end]])
``````

Return zero-based index in the list of the first item whose value is equal to x. Raises a `ValueError` if there is no such item.

The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.

## Linear time-complexity in list length

An `index` call checks every element of the list in order, until it finds a match. If your list is long, and you don"t know roughly where in the list it occurs, this search could become a bottleneck. In that case, you should consider a different data structure. Note that if you know roughly where to find the match, you can give `index` a hint. For instance, in this snippet, `l.index(999_999, 999_990, 1_000_000)` is roughly five orders of magnitude faster than straight `l.index(999_999)`, because the former only has to search 10 entries, while the latter searches a million:

``````>>> import timeit
>>> timeit.timeit("l.index(999_999)", setup="l = list(range(0, 1_000_000))", number=1000)
9.356267921015387
>>> timeit.timeit("l.index(999_999, 999_990, 1_000_000)", setup="l = list(range(0, 1_000_000))", number=1000)
0.0004404920036904514

``````

## Only returns the index of the first match to its argument

A call to `index` searches through the list in order until it finds a match, and stops there. If you expect to need indices of more matches, you should use a list comprehension, or generator expression.

``````>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
``````

Most places where I once would have used `index`, I now use a list comprehension or generator expression because they"re more generalizable. So if you"re considering reaching for `index`, take a look at these excellent Python features.

## Throws if element not present in list

A call to `index` results in a `ValueError` if the item"s not present.

``````>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
``````

If the item might not be present in the list, you should either

1. Check for it first with `item in my_list` (clean, readable approach), or
2. Wrap the `index` call in a `try/except` block which catches `ValueError` (probably faster, at least when the list to search is long, and the item is usually present.)

One thing that is really helpful in learning Python is to use the interactive help function:

``````>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
...

|
|  index(...)
|      L.index(value, [start, [stop]]) -> integer -- return first index of value
|
``````

which will often lead you to the method you are looking for.

The majority of answers explain how to find a single index, but their methods do not return multiple indexes if the item is in the list multiple times. Use `enumerate()`:

``````for i, j in enumerate(["foo", "bar", "baz"]):
if j == "bar":
print(i)
``````

The `index()` function only returns the first occurrence, while `enumerate()` returns all occurrences.

As a list comprehension:

``````[i for i, j in enumerate(["foo", "bar", "baz"]) if j == "bar"]
``````

Here"s also another small solution with `itertools.count()` (which is pretty much the same approach as enumerate):

``````from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ["foo", "bar", "baz"]) if j == "bar"]
``````

This is more efficient for larger lists than using `enumerate()`:

``````\$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ["foo", "bar", "baz"]*500) if j == "bar"]"
10000 loops, best of 3: 174 usec per loop
\$ python -m timeit "[i for i, j in enumerate(["foo", "bar", "baz"]*500) if j == "bar"]"
10000 loops, best of 3: 196 usec per loop
``````

To get all indexes:

``````indexes = [i for i,x in enumerate(xs) if x == "foo"]
``````

`index()` returns the first index of value!

| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value

``````def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices

all_indices("foo", ["foo";"bar";"baz";"foo"])
``````

## JSON datetime between Python and JavaScript

### Question by kevin

I want to send a datetime.datetime object in serialized form from Python using JSON and de-serialize in JavaScript using JSON. What is the best way to do this?

You can add the "default" parameter to json.dumps to handle this:

``````date_handler = lambda obj: (
obj.isoformat()
if isinstance(obj, (datetime.datetime, datetime.date))
else None
)
json.dumps(datetime.datetime.now(), default=date_handler)
""2010-04-20T20:08:21.634121""
``````

Which is ISO 8601 format.

A more comprehensive default handler function:

``````def handler(obj):
if hasattr(obj, "isoformat"):
return obj.isoformat()
elif isinstance(obj, ...):
return ...
else:
raise TypeError, "Object of type %s with value of %s is not JSON serializable" % (type(obj), repr(obj))
``````

Update: Added output of type as well as value.
Update: Also handle date

## Javascript equivalent of Python"s zip function

Is there a javascript equivalent of Python"s zip function? That is, given multiple arrays of equal lengths create an array of pairs.

For instance, if I have three arrays that look like this:

``````var array1 = [1, 2, 3];
var array2 = ["a","b","c"];
var array3 = [4, 5, 6];
``````

The output array should be:

``````var output array:[[1,"a",4], [2,"b",5], [3,"c",6]]
``````

2016 update:

Here"s a snazzier Ecmascript 6 version:

``````zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))
``````

Illustration equiv. to Python{`zip(*args)`}:

``````> zip([["row0col0", "row0col1", "row0col2"],
["row1col0", "row1col1", "row1col2"]]);
[["row0col0","row1col0"],
["row0col1","row1col1"],
["row0col2","row1col2"]]
``````

(and FizzyTea points out that ES6 has variadic argument syntax, so the following function definition will act like python, but see below for disclaimer... this will not be its own inverse so `zip(zip(x))` will not equal `x`; though as Matt Kramer points out `zip(...zip(...x))==x` (like in regular python `zip(*zip(*x))==x`))

Alternative definition equiv. to Python{`zip`}:

``````> zip = (...rows) => [...rows[0]].map((_,c) => rows.map(row => row[c]))
> zip( ["row0col0", "row0col1", "row0col2"] ,
["row1col0", "row1col1", "row1col2"] );
// note zip(row0,row1), not zip(matrix)
``````

(Do note that the `...` syntax may have performance issues at this time, and possibly in the future, so if you use the second answer with variadic arguments, you may want to perf test it. That said it"s been quite a while since it"s been in the standard.)

Make sure to note the addendum if you wish to use this on strings (perhaps there"s a better way to do it now with es6 iterables).

Here"s a oneliner:

``````function zip(arrays) {
return arrays[0].map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}

// > zip([[1,2],[11,22],[111,222]])
// [[1,11,111],[2,22,222]]]

// If you believe the following is a valid return value:
//   > zip([])
//   []
// then you can special-case it, or just do
//  return arrays.length==0 ? [] : arrays[0].map(...)
``````

The above assumes that the arrays are of equal size, as they should be. It also assumes you pass in a single list of lists argument, unlike Python"s version where the argument list is variadic. If you want all of these "features", see below. It takes just about 2 extra lines of code.

The following will mimic Python"s `zip` behavior on edge cases where the arrays are not of equal size, silently pretending the longer parts of arrays don"t exist:

``````function zip() {
var args = [].slice.call(arguments);
var shortest = args.length==0 ? [] : args.reduce(function(a,b){
return a.length<b.length ? a : b
});

return shortest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}

// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222]]]

// > zip()
// []
``````

This will mimic Python"s `itertools.zip_longest` behavior, inserting `undefined` where arrays are not defined:

``````function zip() {
var args = [].slice.call(arguments);
var longest = args.reduce(function(a,b){
return a.length>b.length ? a : b
}, []);

return longest.map(function(_,i){
return args.map(function(array){return array[i]})
});
}

// > zip([1,2],[11,22],[111,222,333])
// [[1,11,111],[2,22,222],[null,null,333]]

// > zip()
// []
``````

If you use these last two version (variadic aka. multiple-argument versions), then zip is no longer its own inverse. To mimic the `zip(*[...])` idiom from Python, you will need to do `zip.apply(this, [...])` when you want to invert the zip function or if you want to similarly have a variable number of lists as input.

To make this handle any iterable (e.g. in Python you can use `zip` on strings, ranges, map objects, etc.), you could define the following:

``````function iterView(iterable) {
// returns an array equivalent to the iterable
}
``````

However if you write `zip` in the following way, even that won"t be necessary:

``````function zip(arrays) {
return Array.apply(null,Array(arrays[0].length)).map(function(_,i){
return arrays.map(function(array){return array[i]})
});
}
``````

Demo:

``````> JSON.stringify( zip(["abcde",[1,2,3,4,5]]) )
[["a",1],["b",2],["c",3],["d",4],["e",5]]
``````

(Or you could use a `range(...)` Python-style function if you"ve written one already. Eventually you will be able to use ECMAScript array comprehensions or generators.)

## What blocks Ruby, Python to get Javascript V8 speed?

Are there any Ruby / Python features that are blocking implementation of optimizations (e.g. inline caching) V8 engine has?

Python is co-developed by Google guys so it shouldn"t be blocked by software patents.

Or this is rather matter of resources put into the V8 project by Google.

What blocks Ruby, Python to get Javascript V8 speed?

Nothing.

Well, okay: money. (And time, people, resources, but if you have money, you can buy those.)

V8 has a team of brilliant, highly-specialized, highly-experienced (and thus highly-paid) engineers working on it, that have decades of experience (I"m talking individually – collectively it"s more like centuries) in creating high-performance execution engines for dynamic OO languages. They are basically the same people who also created the Sun HotSpot JVM (among many others).

Lars Bak, the lead developer, has been literally working on VMs for 25 years (and all of those VMs have lead up to V8), which is basically his entire (professional) life. Some of the people writing Ruby VMs aren"t even 25 years old.

Are there any Ruby / Python features that are blocking implementation of optimizations (e.g. inline caching) V8 engine has?

Given that at least IronRuby, JRuby, MagLev, MacRuby and Rubinius have either monomorphic (IronRuby) or polymorphic inline caching, the answer is obviously no.

Modern Ruby implementations already do a great deal of optimizations. For example, for certain operations, Rubinius"s `Hash` class is faster than YARV"s. Now, this doesn"t sound terribly exciting until you realize that Rubinius"s `Hash` class is implemented in 100% pure Ruby, while YARV"s is implemented in 100% hand-optimized C.

So, at least in some cases, Rubinius can generate better code than GCC!

Or this is rather matter of resources put into the V8 project by Google.

Yes. Not just Google. The lineage of V8"s source code is 25 years old now. The people who are working on V8 also created the Self VM (to this day one of the fastest dynamic OO language execution engines ever created), the Animorphic Smalltalk VM (to this day one of the fastest Smalltalk execution engines ever created), the HotSpot JVM (the fastest JVM ever created, probably the fastest VM period) and OOVM (one of the most efficient Smalltalk VMs ever created).

In fact, Lars Bak, the lead developer of V8, worked on every single one of those, plus a few others.

## Django Template Variables and Javascript

When I render a page using the Django template renderer, I can pass in a dictionary variable containing various values to manipulate them in the page using `{{ myVar }}`.

Is there a way to access the same variable in Javascript (perhaps using the DOM, I don"t know how Django makes the variables accessible)? I want to be able to lookup details using an AJAX lookup based on the values contained in the variables passed in.

The `{{variable}}` is substituted directly into the HTML. Do a view source; it isn"t a "variable" or anything like it. It"s just rendered text.

Having said that, you can put this kind of substitution into your JavaScript.

``````<script type="text/javascript">
var a = "{{someDjangoVariable}}";
</script>
``````

This gives you "dynamic" javascript.

## Web-scraping JavaScript page with Python

I"m trying to develop a simple web scraper. I want to extract text without the HTML code. In fact, I achieve this goal, but I have seen that in some pages where JavaScript is loaded I didn"t obtain good results.

For example, if some JavaScript code adds some text, I can"t see it, because when I call

``````response = urllib2.urlopen(request)
``````

I get the original text without the added one (because JavaScript is executed in the client).

So, I"m looking for some ideas to solve this problem.

EDIT 30/Dec/2017: This answer appears in top results of Google searches, so I decided to update it. The old answer is still at the end.

dryscape isn"t maintained anymore and the library dryscape developers recommend is Python 2 only. I have found using Selenium"s python library with Phantom JS as a web driver fast enough and easy to get the work done.

Once you have installed Phantom JS, make sure the `phantomjs` binary is available in the current path:

``````phantomjs --version
# result:
2.1.1
``````

# Example

To give an example, I created a sample page with following HTML code. (link):

``````<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>Javascript scraping test</title>
<body>
<p id="intro-text">No javascript support</p>
<script>
document.getElementById("intro-text").innerHTML = "Yay! Supports javascript";
</script>
</body>
</html>
``````

without javascript it says: `No javascript support` and with javascript: `Yay! Supports javascript`

# Scraping without JS support:

``````import requests
from bs4 import BeautifulSoup
response = requests.get(my_url)
soup = BeautifulSoup(response.text)
soup.find(id="intro-text")
# Result:
<p id="intro-text">No javascript support</p>
``````

# Scraping with JS support:

``````from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get(my_url)
p_element = driver.find_element_by_id(id_="intro-text")
print(p_element.text)
# result:
"Yay! Supports javascript"
``````

You can also use Python library dryscrape to scrape javascript driven websites.

# Scraping with JS support:

``````import dryscrape
from bs4 import BeautifulSoup
session = dryscrape.Session()
session.visit(my_url)
response = session.body()
soup = BeautifulSoup(response)
soup.find(id="intro-text")
# Result:
<p id="intro-text">Yay! Supports javascript</p>
``````

## How do I merge two dictionaries in a single expression (taking union of dictionaries)?

### Question by Carl Meyer

I have two Python dictionaries, and I want to write a single expression that returns these two dictionaries, merged (i.e. taking the union). The `update()` method would be what I need, if it returned its result instead of modifying a dictionary in-place.

``````>>> x = {"a": 1, "b": 2}
>>> y = {"b": 10, "c": 11}
>>> z = x.update(y)
>>> print(z)
None
>>> x
{"a": 1, "b": 10, "c": 11}
``````

How can I get that final merged dictionary in `z`, not `x`?

(To be extra-clear, the last-one-wins conflict-handling of `dict.update()` is what I"m looking for as well.)

## How can I merge two Python dictionaries in a single expression?

For dictionaries `x` and `y`, `z` becomes a shallowly-merged dictionary with values from `y` replacing those from `x`.

• In Python 3.9.0 or greater (released 17 October 2020): PEP-584, discussed here, was implemented and provides the simplest method:

``````z = x | y          # NOTE: 3.9+ ONLY
``````
• In Python 3.5 or greater:

``````z = {**x, **y}
``````
• In Python 2, (or 3.4 or lower) write a function:

``````def merge_two_dicts(x, y):
z.update(y)    # modifies z with keys and values of y
return z
``````

and now:

``````z = merge_two_dicts(x, y)
``````

### Explanation

Say you have two dictionaries and you want to merge them into a new dictionary without altering the original dictionaries:

``````x = {"a": 1, "b": 2}
y = {"b": 3, "c": 4}
``````

The desired result is to get a new dictionary (`z`) with the values merged, and the second dictionary"s values overwriting those from the first.

``````>>> z
{"a": 1, "b": 3, "c": 4}
``````

A new syntax for this, proposed in PEP 448 and available as of Python 3.5, is

``````z = {**x, **y}
``````

And it is indeed a single expression.

Note that we can merge in with literal notation as well:

``````z = {**x, "foo": 1, "bar": 2, **y}
``````

and now:

``````>>> z
{"a": 1, "b": 3, "foo": 1, "bar": 2, "c": 4}
``````

It is now showing as implemented in the release schedule for 3.5, PEP 478, and it has now made its way into the What"s New in Python 3.5 document.

However, since many organizations are still on Python 2, you may wish to do this in a backward-compatible way. The classically Pythonic way, available in Python 2 and Python 3.0-3.4, is to do this as a two-step process:

``````z = x.copy()
z.update(y) # which returns None since it mutates z
``````

In both approaches, `y` will come second and its values will replace `x`"s values, thus `b` will point to `3` in our final result.

## Not yet on Python 3.5, but want a single expression

If you are not yet on Python 3.5 or need to write backward-compatible code, and you want this in a single expression, the most performant while the correct approach is to put it in a function:

``````def merge_two_dicts(x, y):
"""Given two dictionaries, merge them into a new dict as a shallow copy."""
z = x.copy()
z.update(y)
return z
``````

and then you have a single expression:

``````z = merge_two_dicts(x, y)
``````

You can also make a function to merge an arbitrary number of dictionaries, from zero to a very large number:

``````def merge_dicts(*dict_args):
"""
Given any number of dictionaries, shallow copy and merge into a new dict,
precedence goes to key-value pairs in latter dictionaries.
"""
result = {}
for dictionary in dict_args:
result.update(dictionary)
return result
``````

This function will work in Python 2 and 3 for all dictionaries. e.g. given dictionaries `a` to `g`:

``````z = merge_dicts(a, b, c, d, e, f, g)
``````

and key-value pairs in `g` will take precedence over dictionaries `a` to `f`, and so on.

Don"t use what you see in the formerly accepted answer:

``````z = dict(x.items() + y.items())
``````

In Python 2, you create two lists in memory for each dict, create a third list in memory with length equal to the length of the first two put together, and then discard all three lists to create the dict. In Python 3, this will fail because you"re adding two `dict_items` objects together, not two lists -

``````>>> c = dict(a.items() + b.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: "dict_items" and "dict_items"
``````

and you would have to explicitly create them as lists, e.g. `z = dict(list(x.items()) + list(y.items()))`. This is a waste of resources and computation power.

Similarly, taking the union of `items()` in Python 3 (`viewitems()` in Python 2.7) will also fail when values are unhashable objects (like lists, for example). Even if your values are hashable, since sets are semantically unordered, the behavior is undefined in regards to precedence. So don"t do this:

``````>>> c = dict(a.items() | b.items())
``````

This example demonstrates what happens when values are unhashable:

``````>>> x = {"a": []}
>>> y = {"b": []}
>>> dict(x.items() | y.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: "list"
``````

Here"s an example where `y` should have precedence, but instead the value from `x` is retained due to the arbitrary order of sets:

``````>>> x = {"a": 2}
>>> y = {"a": 1}
>>> dict(x.items() | y.items())
{"a": 2}
``````

Another hack you should not use:

``````z = dict(x, **y)
``````

This uses the `dict` constructor and is very fast and memory-efficient (even slightly more so than our two-step process) but unless you know precisely what is happening here (that is, the second dict is being passed as keyword arguments to the dict constructor), it"s difficult to read, it"s not the intended usage, and so it is not Pythonic.

Here"s an example of the usage being remediated in django.

Dictionaries are intended to take hashable keys (e.g. `frozenset`s or tuples), but this method fails in Python 3 when keys are not strings.

``````>>> c = dict(a, **b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: keyword arguments must be strings
``````

From the mailing list, Guido van Rossum, the creator of the language, wrote:

I am fine with declaring dict({}, **{1:3}) illegal, since after all it is abuse of the ** mechanism.

and

Apparently dict(x, **y) is going around as "cool hack" for "call x.update(y) and return x". Personally, I find it more despicable than cool.

It is my understanding (as well as the understanding of the creator of the language) that the intended usage for `dict(**y)` is for creating dictionaries for readability purposes, e.g.:

``````dict(a=1, b=10, c=11)
``````

``````{"a": 1, "b": 10, "c": 11}
``````

Despite what Guido says, `dict(x, **y)` is in line with the dict specification, which btw. works for both Python 2 and 3. The fact that this only works for string keys is a direct consequence of how keyword parameters work and not a short-coming of dict. Nor is using the ** operator in this place an abuse of the mechanism, in fact, ** was designed precisely to pass dictionaries as keywords.

Again, it doesn"t work for 3 when keys are not strings. The implicit calling contract is that namespaces take ordinary dictionaries, while users must only pass keyword arguments that are strings. All other callables enforced it. `dict` broke this consistency in Python 2:

``````>>> foo(**{("a", "b"): None})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() keywords must be strings
>>> dict(**{("a", "b"): None})
{("a", "b"): None}
``````

This inconsistency was bad given other implementations of Python (PyPy, Jython, IronPython). Thus it was fixed in Python 3, as this usage could be a breaking change.

I submit to you that it is malicious incompetence to intentionally write code that only works in one version of a language or that only works given certain arbitrary constraints.

`dict(x.items() + y.items())` is still the most readable solution for Python 2. Readability counts.

My response: `merge_two_dicts(x, y)` actually seems much clearer to me, if we"re actually concerned about readability. And it is not forward compatible, as Python 2 is increasingly deprecated.

`{**x, **y}` does not seem to handle nested dictionaries. the contents of nested keys are simply overwritten, not merged [...] I ended up being burnt by these answers that do not merge recursively and I was surprised no one mentioned it. In my interpretation of the word "merging" these answers describe "updating one dict with another", and not merging.

Yes. I must refer you back to the question, which is asking for a shallow merge of two dictionaries, with the first"s values being overwritten by the second"s - in a single expression.

Assuming two dictionaries of dictionaries, one might recursively merge them in a single function, but you should be careful not to modify the dictionaries from either source, and the surest way to avoid that is to make a copy when assigning values. As keys must be hashable and are usually therefore immutable, it is pointless to copy them:

``````from copy import deepcopy

def dict_of_dicts_merge(x, y):
z = {}
overlapping_keys = x.keys() & y.keys()
for key in overlapping_keys:
z[key] = dict_of_dicts_merge(x[key], y[key])
for key in x.keys() - overlapping_keys:
z[key] = deepcopy(x[key])
for key in y.keys() - overlapping_keys:
z[key] = deepcopy(y[key])
return z
``````

Usage:

``````>>> x = {"a":{1:{}}, "b": {2:{}}}
>>> y = {"b":{10:{}}, "c": {11:{}}}
>>> dict_of_dicts_merge(x, y)
{"b": {2: {}, 10: {}}, "a": {1: {}}, "c": {11: {}}}
``````

Coming up with contingencies for other value types is far beyond the scope of this question, so I will point you at my answer to the canonical question on a "Dictionaries of dictionaries merge".

## Less Performant But Correct Ad-hocs

These approaches are less performant, but they will provide correct behavior. They will be much less performant than `copy` and `update` or the new unpacking because they iterate through each key-value pair at a higher level of abstraction, but they do respect the order of precedence (latter dictionaries have precedence)

You can also chain the dictionaries manually inside a dict comprehension:

``````{k: v for d in dicts for k, v in d.items()} # iteritems in Python 2.7
``````

or in Python 2.6 (and perhaps as early as 2.4 when generator expressions were introduced):

``````dict((k, v) for d in dicts for k, v in d.items()) # iteritems in Python 2
``````

`itertools.chain` will chain the iterators over the key-value pairs in the correct order:

``````from itertools import chain
z = dict(chain(x.items(), y.items())) # iteritems in Python 2
``````

## Performance Analysis

I"m only going to do the performance analysis of the usages known to behave correctly. (Self-contained so you can copy and paste yourself.)

``````from timeit import repeat
from itertools import chain

x = dict.fromkeys("abcdefg")
y = dict.fromkeys("efghijk")

def merge_two_dicts(x, y):
z = x.copy()
z.update(y)
return z

min(repeat(lambda: {**x, **y}))
min(repeat(lambda: merge_two_dicts(x, y)))
min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()}))
min(repeat(lambda: dict(chain(x.items(), y.items()))))
min(repeat(lambda: dict(item for d in (x, y) for item in d.items())))
``````

In Python 3.8.1, NixOS:

``````>>> min(repeat(lambda: {**x, **y}))
1.0804965235292912
>>> min(repeat(lambda: merge_two_dicts(x, y)))
1.636518670246005
>>> min(repeat(lambda: {k: v for d in (x, y) for k, v in d.items()}))
3.1779992282390594
>>> min(repeat(lambda: dict(chain(x.items(), y.items()))))
2.740647904574871
>>> min(repeat(lambda: dict(item for d in (x, y) for item in d.items())))
4.266070580109954
``````
``````\$ uname -a
Linux nixos 4.19.113 #1-NixOS SMP Wed Mar 25 07:06:15 UTC 2020 x86_64 GNU/Linux
``````

## Resources on Dictionaries

In your case, what you can do is:

``````z = dict(list(x.items()) + list(y.items()))
``````

This will, as you want it, put the final dict in `z`, and make the value for key `b` be properly overridden by the second (`y`) dict"s value:

``````>>> x = {"a":1, "b": 2}
>>> y = {"b":10, "c": 11}
>>> z = dict(list(x.items()) + list(y.items()))
>>> z
{"a": 1, "c": 11, "b": 10}

``````

If you use Python 2, you can even remove the `list()` calls. To create z:

``````>>> z = dict(x.items() + y.items())
>>> z
{"a": 1, "c": 11, "b": 10}
``````

If you use Python version 3.9.0a4 or greater, then you can directly use:

``````x = {"a":1, "b": 2}
y = {"b":10, "c": 11}
z = x | y
print(z)
``````
``````{"a": 1, "c": 11, "b": 10}
``````

An alternative:

``````z = x.copy()
z.update(y)
``````

Another, more concise, option:

``````z = dict(x, **y)
``````

Note: this has become a popular answer, but it is important to point out that if `y` has any non-string keys, the fact that this works at all is an abuse of a CPython implementation detail, and it does not work in Python 3, or in PyPy, IronPython, or Jython. Also, Guido is not a fan. So I can"t recommend this technique for forward-compatible or cross-implementation portable code, which really means it should be avoided entirely.

This probably won"t be a popular answer, but you almost certainly do not want to do this. If you want a copy that"s a merge, then use copy (or deepcopy, depending on what you want) and then update. The two lines of code are much more readable - more Pythonic - than the single line creation with .items() + .items(). Explicit is better than implicit.

In addition, when you use .items() (pre Python 3.0), you"re creating a new list that contains the items from the dict. If your dictionaries are large, then that is quite a lot of overhead (two large lists that will be thrown away as soon as the merged dict is created). update() can work more efficiently, because it can run through the second dict item-by-item.

In terms of time:

``````>>> timeit.Timer("dict(x, **y)", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
15.52571702003479
>>> timeit.Timer("temp = x.copy()
temp.update(y)", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
15.694622993469238
>>> timeit.Timer("dict(x.items() + y.items())", "x = dict(zip(range(1000), range(1000)))
y=dict(zip(range(1000,2000), range(1000,2000)))").timeit(100000)
41.484580039978027
``````

IMO the tiny slowdown between the first two is worth it for the readability. In addition, keyword arguments for dictionary creation was only added in Python 2.3, whereas copy() and update() will work in older versions.

## How to execute a program or call a system command?

### Question by alan lai

How do you call an external command (as if I"d typed it at the Unix shell or Windows command prompt) from within a Python script?

Use the `subprocess` module in the standard library:

``````import subprocess
subprocess.run(["ls", "-l"])
``````

The advantage of `subprocess.run` over `os.system` is that it is more flexible (you can get the `stdout`, `stderr`, the "real" status code, better error handling, etc...).

Even the documentation for `os.system` recommends using `subprocess` instead:

The `subprocess` module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. See the Replacing Older Functions with the subprocess Module section in the `subprocess` documentation for some helpful recipes.

On Python 3.4 and earlier, use `subprocess.call` instead of `.run`:

``````subprocess.call(["ls", "-l"])
``````

Here"s a summary of the ways to call external programs and the advantages and disadvantages of each:

1. `os.system("some_command with args")` passes the command and arguments to your system"s shell. This is nice because you can actually run multiple commands at once in this manner and set up pipes and input/output redirection. For example:

``````os.system("some_command < input_file | another_command > output_file")
``````

However, while this is convenient, you have to manually handle the escaping of shell characters such as spaces, et cetera. On the other hand, this also lets you run commands which are simply shell commands and not actually external programs. See the documentation.

2. `stream = os.popen("some_command with args")` will do the same thing as `os.system` except that it gives you a file-like object that you can use to access standard input/output for that process. There are 3 other variants of popen that all handle the i/o slightly differently. If you pass everything as a string, then your command is passed to the shell; if you pass them as a list then you don"t need to worry about escaping anything. See the documentation.

3. The `Popen` class of the `subprocess` module. This is intended as a replacement for `os.popen`, but has the downside of being slightly more complicated by virtue of being so comprehensive. For example, you"d say:

``````print subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()
``````

``````print os.popen("echo Hello World").read()
``````

but it is nice to have all of the options there in one unified class instead of 4 different popen functions. See the documentation.

4. The `call` function from the `subprocess` module. This is basically just like the `Popen` class and takes all of the same arguments, but it simply waits until the command completes and gives you the return code. For example:

``````return_code = subprocess.call("echo Hello World", shell=True)
``````
5. If you"re on Python 3.5 or later, you can use the new `subprocess.run` function, which is a lot like the above but even more flexible and returns a `CompletedProcess` object when the command finishes executing.

6. The `os` module also has all of the fork/exec/spawn functions that you"d have in a C program, but I don"t recommend using them directly.

The `subprocess` module should probably be what you use.

Finally, please be aware that for all methods where you pass the final command to be executed by the shell as a string and you are responsible for escaping it. There are serious security implications if any part of the string that you pass can not be fully trusted. For example, if a user is entering some/any part of the string. If you are unsure, only use these methods with constants. To give you a hint of the implications consider this code:

``````print subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()
``````

and imagine that the user enters something "`my mama didnt love me && rm -rf /`" which could erase the whole filesystem.

Typical implementation:

``````import subprocess

p = subprocess.Popen("ls", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print line,
retval = p.wait()
``````

You are free to do what you want with the `stdout` data in the pipe. In fact, you can simply omit those parameters (`stdout=` and `stderr=`) and it"ll behave like `os.system()`.

Some hints on detaching the child process from the calling one (starting the child process in background).

Suppose you want to start a long task from a CGI script. That is, the child process should live longer than the CGI script execution process.

The classical example from the subprocess module documentation is:

``````import subprocess
import sys

# Some code here

pid = subprocess.Popen([sys.executable, "longtask.py"]) # Call subprocess

# Some more code here
``````

The idea here is that you do not want to wait in the line "call subprocess" until the longtask.py is finished. But it is not clear what happens after the line "some more code here" from the example.

My target platform was FreeBSD, but the development was on Windows, so I faced the problem on Windows first.

On Windows (Windows XP), the parent process will not finish until the longtask.py has finished its work. It is not what you want in a CGI script. The problem is not specific to Python; in the PHP community the problems are the same.

The solution is to pass DETACHED_PROCESS Process Creation Flag to the underlying CreateProcess function in Windows API. If you happen to have installed pywin32, you can import the flag from the win32process module, otherwise you should define it yourself:

``````DETACHED_PROCESS = 0x00000008

creationflags=DETACHED_PROCESS).pid
``````

/* UPD 2015.10.27 @eryksun in a comment below notes, that the semantically correct flag is CREATE_NEW_CONSOLE (0x00000010) */

On FreeBSD we have another problem: when the parent process is finished, it finishes the child processes as well. And that is not what you want in a CGI script either. Some experiments showed that the problem seemed to be in sharing sys.stdout. And the working solution was the following:

``````pid = subprocess.Popen([sys.executable, "longtask.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
``````

I have not checked the code on other platforms and do not know the reasons of the behaviour on FreeBSD. If anyone knows, please share your ideas. Googling on starting background processes in Python does not shed any light yet.

``````import os
``````

Note that this is dangerous, since the command isn"t cleaned. I leave it up to you to google for the relevant documentation on the "os" and "sys" modules. There are a bunch of functions (exec* and spawn*) that will do similar things.

## Shop

Best laptop for Sims 4

\$

Best laptop for Zoom

\$499

Best laptop for Minecraft

\$590

Best laptop for engineering student

\$

Best laptop for development

\$

Best laptop for Cricut Maker

\$

Best laptop for hacking

\$890

Best laptop for Machine Learning

\$950

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

NUMPYNUMPY

How to convert Nonetype to int or string?

NUMPYNUMPY

How to specify multiple return types using type-hints

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

## Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method