Inconsistency with split() - Script, OS, or Package Problem?

J

James Wright

Hello,

I have been using a script on several boxes that have been around for
a while, and everything works just fine. I am finding though, that on
some new OS installs the script fails with:

Traceback (most recent call last):
File "render4.py", line 114, in <module>
create_report_index(each_item)
File "render4.py", line 25, in create_report_index
[clean_name, _] = each_value.split('_', 1)
ValueError: need more than 1 value to unpack


The OS's are various OpenSuse installs from 10.3 to 11.4. It works on
all the existing ones, which leads me to believe that I have a package
or configuration inconsistency. It should be noted though that I am
quite new to python programming and very well could have coded in a
non-portable manner and was just lucky to get it working in the first
place :)

Here is the code snippet that generates the failure ( when you look
at this remember that I am a novice :) ):

for each_item in D4: #D4 is a dictionary
create_report_index(each_item)

def create_report_index(report): #Here we are creating a simple
index.html file from data in a text file
newfile = open(report + '.html', 'w') #Create the index file using
report name
for each_value in D4[report]:
[clean_name, _] = each_value.split('_', 1)
newfile.write('<a href="' + report +'//' + each_value +
'/index.htm">' + clean_name + '</a><BR>\n')


I've tried to match packages from a known working install and even
compiled a newer python (one known to work, version 3.1.3 in this
particular case). The only discernible difference is that the new OS
installs are VM's hosted on VMWare ESX. Using the same ISO I can spin
up a VirtualBox VM and the script works just fine. I've tried this
with OpenSuse 11.3 and 11.4, once again, using the exact same ISO's to
install.

Do I have a Python, OS, or package issue?


Many thanks,
James
 
S

Steven D'Aprano

Hello,

I have been using a script on several boxes that have been around for a
while, and everything works just fine. I am finding though, that on
some new OS installs the script fails with:

Traceback (most recent call last):
File "render4.py", line 114, in <module>
create_report_index(each_item)
File "render4.py", line 25, in create_report_index
[clean_name, _] = each_value.split('_', 1)
ValueError: need more than 1 value to unpack

It's a data issue, not an OS or package problem.

Firstly, you don't have to wrap the left hand side in brackets, this
works fine:
'aaa'


However, if your data has no underscore at all:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack



So you need to allow for the possibility that there is no underscore.
 
J

James Wright

Thank you Steven,

I will take your advice :) In this particular case though, I do not
think a lack of underscore is the issue, at least as far as I can
understand the issue. Please see my reply to Ethan.


Thanks,
James


Hello,

I have been using a script on several boxes that have been around for a
while, and everything works just fine.  I am finding though, that on
some new OS installs the script fails with:

Traceback (most recent call last):
  File "render4.py", line 114, in <module>
    create_report_index(each_item)
  File "render4.py", line 25, in create_report_index
    [clean_name, _] = each_value.split('_', 1)
ValueError: need more than 1 value to unpack

It's a data issue, not an OS or package problem.

Firstly, you don't have to wrap the left hand side in brackets, this
works fine:
'aaa'


However, if your data has no underscore at all:
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack



So you need to allow for the possibility that there is no underscore.
 
S

Steven D'Aprano

Thank you Steven,

I will take your advice :) In this particular case though, I do not
think a lack of underscore is the issue, at least as far as I can
understand the issue. Please see my reply to Ethan.


In your reply to Ethan, you inserted a print statement in the code and
got this output:

# python render4.py
current each_value is: vsr
Traceback (most recent call last):
File "render4.py", line 115, in <module>
create_report_index(each_item)
File "render4.py", line 26, in create_report_index
[clean_name, _] = each_value.split('_', 1)
ValueError: need more than 1 value to unpack


The current value of each_value is the three letter string "vsr". There
are no underscores in "vsr". Clearly the lack of underscore is the issue.
Now that this has been solved, it has revealed a deeper problem, namely,
how you get an empty key and "vsr" into your data on some machines but
not others.

If your script is behaving differently on different machines with the
same data, it is *far* more likely that there is something non-
deterministic in your code than that it is a bug in either the OS,
Python, or the virtualization environment. Without seeing either your
code or data, it is impossible to know what.

No offense, but are you sure it's not a PEBCAK error? Are you absolutely
sure you're running the same script the same way from the same data on
each virtual machine?

The fact that your script works correctly *once* when you rename it
doesn't strike me with confidence. Renaming the script shouldn't change
its behaviour.

I suppose it is just barely plausible that one of the VMs is reading its
data from faulty sectors on a disk, and hence gets inconsistent results,
but that is stretching the bounds of possibility almost to breaking.

You posted the data and script to Alex off list. Perhaps you could post
it again on-list? As they say, many eyes make bugs shallow.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top